fix: serialization of enum args for graphql (#34)

This commit is contained in:
2023-03-14 14:56:49 +01:00
committed by GitHub
parent 1b31331765
commit 8fd6bb983e
7 changed files with 97 additions and 8 deletions

View File

@@ -18,7 +18,7 @@ eyre = "0.6.8"
futures = "0.3.27"
gql_client = "1.0.7"
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"] }
derive_builder = "0.12.0"

View File

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

View File

@@ -68,6 +68,32 @@ impl Selection {
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> {
let mut fields = vec!["query".to_string()];
@@ -76,7 +102,7 @@ impl Selection {
if let Some(args) = sel.args {
let actualargs = args
.iter()
.map(|(name, arg)| format!("{name}:{arg}"))
.map(|(name, arg)| format!("{name}:{}", arg.as_str()))
.collect::<Vec<_>>();
query = query.add(&format!("({})", actualargs.join(", ")));
@@ -99,6 +125,9 @@ impl Selection {
{
let query = self.build()?;
let qbs = query.as_str();
println!("{}", qbs);
let resp: Option<serde_json::Value> = match gql_client.query(&query).await {
Ok(r) => r,
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_33;