feat: fix serialization of enum args for graphql

This commit is contained in:
Kasper Juul Hermansen 2023-03-14 14:48:28 +01:00
parent 1b31331765
commit 2c04387c3d
Signed by: kjuulh
GPG Key ID: 57B6E1465221F912
7 changed files with 97 additions and 8 deletions

View File

@ -196,6 +196,22 @@ pub fn type_ref_is_scalar(type_ref: &TypeRef) -> bool {
.unwrap_or(false) .unwrap_or(false)
} }
pub fn type_ref_is_enum(type_ref: &TypeRef) -> bool {
let mut type_ref = type_ref.clone();
if type_ref
.kind
.pipe(|k| *k == __TypeKind::NON_NULL)
.unwrap_or(false)
{
type_ref = *type_ref.of_type.unwrap().clone();
}
type_ref
.kind
.pipe(|k| *k == __TypeKind::ENUM)
.unwrap_or(false)
}
pub fn type_ref_is_object(type_ref: &TypeRef) -> bool { pub fn type_ref_is_object(type_ref: &TypeRef) -> bool {
let mut type_ref = type_ref.clone(); let mut type_ref = type_ref.clone();
if type_ref if type_ref

View File

@ -5,8 +5,8 @@ use genco::quote;
use genco::tokens::quoted; use genco::tokens::quoted;
use crate::functions::{ use crate::functions::{
type_field_has_optional, type_ref_is_list, type_ref_is_list_of_objects, type_ref_is_object, type_field_has_optional, type_ref_is_enum, type_ref_is_list, type_ref_is_list_of_objects,
type_ref_is_optional, type_ref_is_scalar, CommonFunctions, Scalar, type_ref_is_object, type_ref_is_optional, type_ref_is_scalar, CommonFunctions, Scalar,
}; };
use crate::utility::OptionExt; use crate::utility::OptionExt;
@ -133,6 +133,12 @@ fn render_required_args(_funcs: &CommonFunctions, field: &FullTypeFields) -> Opt
} }
} }
if type_ref_is_enum(&s.input_value.type_) {
return Some(quote! {
query = query.arg_enum($(quoted(name)), $(n));
})
}
if type_ref_is_list(&s.input_value.type_) { if type_ref_is_list(&s.input_value.type_) {
let inner = *s let inner = *s
.input_value .input_value
@ -187,6 +193,14 @@ fn render_optional_args(_funcs: &CommonFunctions, field: &FullTypeFields) -> Opt
let n = format_struct_name(&s.input_value.name); let n = format_struct_name(&s.input_value.name);
let name = &s.input_value.name; let name = &s.input_value.name;
if type_ref_is_enum(&s.input_value.type_) {
return Some(quote! {
if let Some($(&n)) = opts.$(&n) {
query = query.arg_enum($(quoted(name)), $(n));
}
});
}
Some(quote! { Some(quote! {
if let Some($(&n)) = opts.$(&n) { if let Some($(&n)) = opts.$(&n) {
query = query.arg($(quoted(name)), $(&n)); query = query.arg($(quoted(name)), $(&n));

View File

@ -18,7 +18,7 @@ eyre = "0.6.8"
futures = "0.3.27" futures = "0.3.27"
gql_client = "1.0.7" gql_client = "1.0.7"
serde = { version = "1.0.152", features = ["derive"] } serde = { version = "1.0.152", features = ["derive"] }
serde_json = "1.0.93" serde_json = { version = "1.0.93", features = ["raw_value"] }
tokio = { version = "1.25.0", features = ["full"] } tokio = { version = "1.25.0", features = ["full"] }
derive_builder = "0.12.0" derive_builder = "0.12.0"

View File

@ -955,7 +955,7 @@ impl Container {
query = query.arg("port", port); query = query.arg("port", port);
if let Some(protocol) = opts.protocol { if let Some(protocol) = opts.protocol {
query = query.arg("protocol", protocol); query = query.arg_enum("protocol", protocol);
} }
if let Some(description) = opts.description { if let Some(description) = opts.description {
query = query.arg("description", description); query = query.arg("description", description);
@ -1085,7 +1085,7 @@ impl Container {
query = query.arg("source", source); query = query.arg("source", source);
} }
if let Some(sharing) = opts.sharing { if let Some(sharing) = opts.sharing {
query = query.arg("sharing", sharing); query = query.arg_enum("sharing", sharing);
} }
return Container { return Container {
@ -1395,7 +1395,7 @@ impl Container {
query = query.arg("port", port); query = query.arg("port", port);
if let Some(protocol) = opts.protocol { if let Some(protocol) = opts.protocol {
query = query.arg("protocol", protocol); query = query.arg_enum("protocol", protocol);
} }
return Container { return Container {
@ -2848,9 +2848,9 @@ impl Socket {
} }
#[derive(Serialize, Deserialize, Clone, PartialEq, Debug)] #[derive(Serialize, Deserialize, Clone, PartialEq, Debug)]
pub enum CacheSharingMode { pub enum CacheSharingMode {
LOCKED,
SHARED, SHARED,
PRIVATE, PRIVATE,
LOCKED,
} }
#[derive(Serialize, Deserialize, Clone, PartialEq, Debug)] #[derive(Serialize, Deserialize, Clone, PartialEq, Debug)]
pub enum NetworkProtocol { pub enum NetworkProtocol {

View File

@ -68,6 +68,32 @@ impl Selection {
s s
} }
pub fn arg_enum<S>(&self, name: &str, value: S) -> Selection
where
S: Serialize,
{
let mut s = self.clone();
let val = serde_json::to_string(&value).unwrap();
let val = val[1..val.len() - 1].to_string();
println!("test");
println!("{}", val);
match s.args.as_mut() {
Some(args) => {
let _ = args.insert(name.to_string(), val);
}
None => {
let mut hm = HashMap::new();
let _ = hm.insert(name.to_string(), val);
s.args = Some(hm);
}
}
s
}
pub fn build(&self) -> eyre::Result<String> { pub fn build(&self) -> eyre::Result<String> {
let mut fields = vec!["query".to_string()]; let mut fields = vec!["query".to_string()];
@ -76,7 +102,7 @@ impl Selection {
if let Some(args) = sel.args { if let Some(args) = sel.args {
let actualargs = args let actualargs = args
.iter() .iter()
.map(|(name, arg)| format!("{name}:{arg}")) .map(|(name, arg)| format!("{name}:{}", arg.as_str()))
.collect::<Vec<_>>(); .collect::<Vec<_>>();
query = query.add(&format!("({})", actualargs.join(", "))); query = query.add(&format!("({})", actualargs.join(", ")));
@ -99,6 +125,9 @@ impl Selection {
{ {
let query = self.build()?; let query = self.build()?;
let qbs = query.as_str();
println!("{}", qbs);
let resp: Option<serde_json::Value> = match gql_client.query(&query).await { let resp: Option<serde_json::Value> = match gql_client.query(&query).await {
Ok(r) => r, Ok(r) => r,
Err(e) => eyre::bail!(e), Err(e) => eyre::bail!(e),

View File

@ -0,0 +1,29 @@
use dagger_sdk::{ContainerWithExposedPortOpts, NetworkProtocol};
#[tokio::test]
async fn test_issue_30_alt() -> eyre::Result<()> {
let client = dagger_sdk::connect().await?;
client
.container()
.from("denoland/deno:debian-1.30.3")
.with_exposed_port_opts(
53,
ContainerWithExposedPortOpts {
protocol: Some(NetworkProtocol::TCP),
description: None,
},
)
.with_exposed_port_opts(
53,
ContainerWithExposedPortOpts {
protocol: Some(NetworkProtocol::UDP),
description: None,
},
)
.with_exec(vec!["echo", "hello"])
.exit_code()
.await?;
Ok(())
}

View File

@ -1 +1,2 @@
mod iss_30; mod iss_30;
mod iss_33;