mirror of
https://github.com/kjuulh/dagger-rs.git
synced 2024-11-25 16:32:42 +01:00
fix: serialization of enum args for graphql (#34)
This commit is contained in:
parent
1b31331765
commit
8fd6bb983e
@ -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
|
||||||
|
@ -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));
|
||||||
|
@ -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"
|
||||||
|
|
||||||
|
@ -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 {
|
||||||
|
@ -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),
|
||||||
|
29
crates/dagger-sdk/tests/issues/iss_33.rs
Normal file
29
crates/dagger-sdk/tests/issues/iss_33.rs
Normal 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(())
|
||||||
|
}
|
@ -1 +1,2 @@
|
|||||||
mod iss_30;
|
mod iss_30;
|
||||||
|
mod iss_33;
|
||||||
|
Loading…
Reference in New Issue
Block a user