feat(sdk): with _opts methods

Now all opt values enter into a _opts function instead of the original.
This avoids a lot of verbosity for both None in the case opts are
unwanted, and Some() if they actually are.

They are used like so:

```rust
client.container().from("...");
client.container_opts(Some(ContainerOpts{ ... }))
```

Some from opts will be removed in a future commit/pr
This commit is contained in:
Kasper Juul Hermansen 2023-02-19 17:43:12 +01:00 committed by Kasper Juul Hermansen
parent 02006d40fc
commit 9762da895a
10 changed files with 447 additions and 99 deletions

View File

@ -39,18 +39,44 @@ pub fn format_function(funcs: &CommonFunctions, field: &FullTypeFields) -> Optio
.pipe(|t| &t.type_ref) .pipe(|t| &t.type_ref)
.pipe(|t| render_output_type(funcs, t)); .pipe(|t| render_output_type(funcs, t));
Some(quote! { if let Some((args, true)) = args {
$(signature)( let required_args = format_required_function_args(funcs, field);
$(args) Some(quote! {
) -> $(output_type) { $(&signature)(
let mut query = self.selection.select($(quoted(field.name.as_ref()))); $(required_args)
) -> $(output_type.as_ref()) {
let mut query = self.selection.select($(quoted(field.name.as_ref())));
$(render_required_args(funcs, field)) $(render_required_args(funcs, field))
$(render_optional_args(funcs, field))
$(render_execution(funcs, field)) $(render_execution(funcs, field))
} }
})
$(&signature)_opts(
$args
) -> $(output_type) {
let mut query = self.selection.select($(quoted(field.name.as_ref())));
$(render_required_args(funcs, field))
$(render_optional_args(funcs, field))
$(render_execution(funcs, field))
}
})
} else {
Some(quote! {
$(signature)(
$(if let Some((args, _)) = args => $args)
) -> $(output_type) {
let mut query = self.selection.select($(quoted(field.name.as_ref())));
$(render_required_args(funcs, field))
$(render_optional_args(funcs, field))
$(render_execution(funcs, field))
}
})
}
} }
fn render_required_args(_funcs: &CommonFunctions, field: &FullTypeFields) -> Option<rust::Tokens> { fn render_required_args(_funcs: &CommonFunctions, field: &FullTypeFields) -> Option<rust::Tokens> {
@ -215,7 +241,10 @@ fn render_execution(funcs: &CommonFunctions, field: &FullTypeFields) -> rust::To
} }
} }
fn format_function_args(funcs: &CommonFunctions, field: &FullTypeFields) -> Option<rust::Tokens> { fn format_function_args(
funcs: &CommonFunctions,
field: &FullTypeFields,
) -> Option<(rust::Tokens, bool)> {
if let Some(args) = field.args.as_ref() { if let Some(args) = field.args.as_ref() {
let args = args let args = args
.into_iter() .into_iter()
@ -241,14 +270,51 @@ fn format_function_args(funcs: &CommonFunctions, field: &FullTypeFields) -> Opti
}; };
if type_field_has_optional(field) { if type_field_has_optional(field) {
Some(quote! { Some((
$(required_args) quote! {
opts: Option<$(field_options_struct_name(field))> $(required_args)
}) opts: Option<$(field_options_struct_name(field))>
},
true,
))
} else { } else {
Some(required_args) Some((required_args, false))
} }
} else { } else {
None None
} }
} }
fn format_required_function_args(
funcs: &CommonFunctions,
field: &FullTypeFields,
) -> Option<rust::Tokens> {
if let Some(args) = field.args.as_ref() {
let args = args
.into_iter()
.map(|a| {
a.as_ref().and_then(|s| {
if type_ref_is_optional(&s.input_value.type_) {
return None;
}
let t = funcs.format_input_type(&s.input_value.type_);
let n = format_struct_name(&s.input_value.name);
Some(quote! {
$(n): $(t),
})
})
})
.flatten()
.collect::<Vec<_>>();
let required_args = quote! {
&self,
$(for arg in args join ($['\r']) => $arg)
};
Some(required_args)
} else {
None
}
}

View File

@ -3,7 +3,7 @@ use dagger_sdk::HostDirectoryOpts;
fn main() -> eyre::Result<()> { fn main() -> eyre::Result<()> {
let client = dagger_sdk::connect()?; let client = dagger_sdk::connect()?;
let host_source_dir = client.host().directory( let host_source_dir = client.host().directory_opts(
"examples/build-the-application/app", "examples/build-the-application/app",
Some(HostDirectoryOpts { Some(HostDirectoryOpts {
exclude: Some(vec!["node_modules".into(), "ci/".into()]), exclude: Some(vec!["node_modules".into(), "ci/".into()]),
@ -12,23 +12,23 @@ fn main() -> eyre::Result<()> {
); );
let source = client let source = client
.container(None) .container()
.from("node:16") .from("node:16")
.with_mounted_directory("/src", host_source_dir.id()?); .with_mounted_directory("/src", host_source_dir.id()?);
let runner = source let runner = source
.with_workdir("/src") .with_workdir("/src")
.with_exec(vec!["npm", "install"], None); .with_exec(vec!["npm", "install"]);
let test = runner.with_exec(vec!["npm", "test", "--", "--watchAll=false"], None); let test = runner.with_exec(vec!["npm", "test", "--", "--watchAll=false"]);
let build_dir = test let build_dir = test
.with_exec(vec!["npm", "run", "build"], None) .with_exec(vec!["npm", "run", "build"])
.directory("./build"); .directory("./build");
let _ = build_dir.export("./build"); let _ = build_dir.export("./build");
let entries = build_dir.entries(None); let entries = build_dir.entries();
println!("build dir contents: \n {:?}", entries); println!("build dir contents: \n {:?}", entries);

View File

@ -3,7 +3,7 @@ use rand::Rng;
fn main() -> eyre::Result<()> { fn main() -> eyre::Result<()> {
let client = dagger_sdk::connect()?; let client = dagger_sdk::connect()?;
let host_source_dir = client.host().directory( let host_source_dir = client.host().directory_opts(
"./examples/caching/app", "./examples/caching/app",
Some( Some(
dagger_sdk::HostDirectoryOptsBuilder::default() dagger_sdk::HostDirectoryOptsBuilder::default()
@ -15,31 +15,28 @@ fn main() -> eyre::Result<()> {
let node_cache = client.cache_volume("node").id()?; let node_cache = client.cache_volume("node").id()?;
let source = client let source = client
.container(None) .container()
.from("node:16") .from("node:16")
.with_mounted_directory("/src", host_source_dir.id()?) .with_mounted_directory("/src", host_source_dir.id()?)
.with_mounted_cache("/src/node_modules", node_cache, None); .with_mounted_cache("/src/node_modules", node_cache);
let runner = source let runner = source
.with_workdir("/src") .with_workdir("/src")
.with_exec(vec!["npm", "install"], None); .with_exec(vec!["npm", "install"]);
let test = runner.with_exec(vec!["npm", "test", "--", "--watchAll=false"], None); let test = runner.with_exec(vec!["npm", "test", "--", "--watchAll=false"]);
let build_dir = test let build_dir = test
.with_exec(vec!["npm", "run", "build"], None) .with_exec(vec!["npm", "run", "build"])
.directory("./build"); .directory("./build");
let mut rng = rand::thread_rng(); let mut rng = rand::thread_rng();
let ref_ = client let ref_ = client
.container(None) .container()
.from("nginx") .from("nginx")
.with_directory("/usr/share/nginx/html", build_dir.id()?, None) .with_directory("/usr/share/nginx/html", build_dir.id()?)
.publish( .publish(format!("ttl.sh/hello-dagger-rs-{}:1h", rng.gen::<u64>()))?;
format!("ttl.sh/hello-dagger-rs-{}:1h", rng.gen::<u64>()),
None,
)?;
println!("published image to: {}", ref_); println!("published image to: {}", ref_);

View File

@ -7,15 +7,12 @@ fn main() -> eyre::Result<()> {
let context_dir = client let context_dir = client
.host() .host()
.directory("./examples/existing-dockerfile/app", None); .directory("./examples/existing-dockerfile/app");
let ref_ = client let ref_ = client
.container(None) .container()
.build(context_dir.id()?, None) .build(context_dir.id()?)
.publish( .publish(format!("ttl.sh/hello-dagger-rs-{}:1h", rng.gen::<u64>()))?;
format!("ttl.sh/hello-dagger-rs-{}:1h", rng.gen::<u64>()),
None,
)?;
println!("published image to: {}", ref_); println!("published image to: {}", ref_);

View File

@ -2,9 +2,9 @@ fn main() -> eyre::Result<()> {
let client = dagger_sdk::connect()?; let client = dagger_sdk::connect()?;
let version = client let version = client
.container(None) .container()
.from("golang:1.19") .from("golang:1.19")
.with_exec(vec!["go", "version".into()], None) .with_exec(vec!["go", "version".into()])
.stdout()?; .stdout()?;
println!("Hello from Dagger and {}", version.trim()); println!("Hello from Dagger and {}", version.trim());

View File

@ -4,7 +4,7 @@ use rand::Rng;
fn main() -> eyre::Result<()> { fn main() -> eyre::Result<()> {
let client = dagger_sdk::connect()?; let client = dagger_sdk::connect()?;
let host_source_dir = client.host().directory( let host_source_dir = client.host().directory_opts(
"examples/publish-the-application/app", "examples/publish-the-application/app",
Some(HostDirectoryOpts { Some(HostDirectoryOpts {
exclude: Some(vec!["node_modules", "ci/"]), exclude: Some(vec!["node_modules", "ci/"]),
@ -13,30 +13,27 @@ fn main() -> eyre::Result<()> {
); );
let source = client let source = client
.container(None) .container()
.from("node:16") .from("node:16")
.with_mounted_directory("/src", host_source_dir.id()?); .with_mounted_directory("/src", host_source_dir.id()?);
let runner = source let runner = source
.with_workdir("/src") .with_workdir("/src")
.with_exec(vec!["npm", "install"], None); .with_exec(vec!["npm", "install"]);
let test = runner.with_exec(vec!["npm", "test", "--", "--watchAll=false"], None); let test = runner.with_exec(vec!["npm", "test", "--", "--watchAll=false"]);
let build_dir = test let build_dir = test
.with_exec(vec!["npm", "run", "build"], None) .with_exec(vec!["npm", "run", "build"])
.directory("./build"); .directory("./build");
let mut rng = rand::thread_rng(); let mut rng = rand::thread_rng();
let ref_ = client let ref_ = client
.container(None) .container()
.from("nginx") .from("nginx")
.with_directory("/usr/share/nginx/html", build_dir.id()?, None) .with_directory("/usr/share/nginx/html", build_dir.id()?)
.publish( .publish(format!("ttl.sh/hello-dagger-rs-{}:1h", rng.gen::<u64>()))?;
format!("ttl.sh/hello-dagger-rs-{}:1h", rng.gen::<u64>()),
None,
)?;
println!("published image to: {}", ref_); println!("published image to: {}", ref_);

View File

@ -5,7 +5,7 @@ fn main() -> eyre::Result<()> {
let client = dagger_sdk::connect()?; let client = dagger_sdk::connect()?;
let output = "examples/publish-the-application/app/build"; let output = "examples/publish-the-application/app/build";
let host_source_dir = client.host().directory( let host_source_dir = client.host().directory_opts(
"examples/publish-the-application/app", "examples/publish-the-application/app",
Some(HostDirectoryOpts { Some(HostDirectoryOpts {
exclude: Some(vec!["node_modules", "ci/"]), exclude: Some(vec!["node_modules", "ci/"]),
@ -14,35 +14,31 @@ fn main() -> eyre::Result<()> {
); );
let source = client let source = client
.container(None) .container()
.from("node:16") .from("node:16")
.with_mounted_directory("/src", host_source_dir.id()?); .with_mounted_directory("/src", host_source_dir.id()?);
let runner = source let runner = source
.with_workdir("/src") .with_workdir("/src")
.with_exec(vec!["npm", "install"], None); .with_exec(vec!["npm", "install"]);
let test = runner.with_exec(vec!["npm", "test", "--", "--watchAll=false"], None); let test = runner.with_exec(vec!["npm", "test", "--", "--watchAll=false"]);
let _ = test let _ = test
.with_exec(vec!["npm", "run", "build"], None) .with_exec(vec!["npm", "run", "build"])
.directory("./build") .directory("./build")
.export(output); .export(output);
let mut rng = rand::thread_rng(); let mut rng = rand::thread_rng();
let ref_ = client let ref_ = client
.container(None) .container()
.from("nginx") .from("nginx")
.with_directory( .with_directory(
"/usr/share/nginx/html", "/usr/share/nginx/html",
client.host().directory(output, None).id()?, client.host().directory(output).id()?,
None,
) )
.publish( .publish(format!("ttl.sh/hello-dagger-rs-{}:1h", rng.gen::<u64>()))?;
format!("ttl.sh/hello-dagger-rs-{}:1h", rng.gen::<u64>()),
None,
)?;
println!("published image to: {}", ref_); println!("published image to: {}", ref_);

View File

@ -3,7 +3,7 @@ use dagger_sdk::HostDirectoryOpts;
fn main() -> eyre::Result<()> { fn main() -> eyre::Result<()> {
let client = dagger_sdk::connect()?; let client = dagger_sdk::connect()?;
let host_source_dir = client.host().directory( let host_source_dir = client.host().directory_opts(
"examples/test-the-application/app", "examples/test-the-application/app",
Some(HostDirectoryOpts { Some(HostDirectoryOpts {
exclude: Some(vec!["node_modules", "ci/"]), exclude: Some(vec!["node_modules", "ci/"]),
@ -12,16 +12,16 @@ fn main() -> eyre::Result<()> {
); );
let source = client let source = client
.container(None) .container()
.from("node:16") .from("node:16")
.with_mounted_directory("/src", host_source_dir.id()?); .with_mounted_directory("/src", host_source_dir.id()?);
let runner = source let runner = source
.with_workdir("/src") .with_workdir("/src")
.with_exec(vec!["npm", "install"], None); .with_exec(vec!["npm", "install"]);
let out = runner let out = runner
.with_exec(vec!["npm", "test", "--", "--watchAll=false"], None) .with_exec(vec!["npm", "test", "--", "--watchAll=false"])
.stderr()?; .stderr()?;
println!("{}", out); println!("{}", out);

View File

@ -22,8 +22,8 @@ pub struct SecretId(String);
pub struct SocketId(String); pub struct SocketId(String);
#[derive(Serialize, Deserialize, Debug, PartialEq, Clone)] #[derive(Serialize, Deserialize, Debug, PartialEq, Clone)]
pub struct BuildArg { pub struct BuildArg {
pub name: String,
pub value: String, pub value: String,
pub name: String,
} }
pub struct CacheVolume { pub struct CacheVolume {
pub proc: Arc<Child>, pub proc: Arc<Child>,
@ -125,7 +125,19 @@ pub struct ContainerWithNewFileOpts<'a> {
} }
impl Container { impl Container {
pub fn build(&self, context: DirectoryId, opts: Option<ContainerBuildOpts>) -> Container { pub fn build(&self, context: DirectoryId) -> Container {
let mut query = self.selection.select("build");
query = query.arg("context", context);
return Container {
proc: self.proc.clone(),
selection: query,
conn: self.conn.clone(),
};
}
pub fn build_opts(&self, context: DirectoryId, opts: Option<ContainerBuildOpts>) -> Container {
let mut query = self.selection.select("build"); let mut query = self.selection.select("build");
query = query.arg("context", context); query = query.arg("context", context);
@ -184,7 +196,17 @@ impl Container {
conn: self.conn.clone(), conn: self.conn.clone(),
}]; }];
} }
pub fn exec(&self, opts: Option<ContainerExecOpts>) -> Container { pub fn exec(&self) -> Container {
let mut query = self.selection.select("exec");
return Container {
proc: self.proc.clone(),
selection: query,
conn: self.conn.clone(),
};
}
pub fn exec_opts(&self, opts: Option<ContainerExecOpts>) -> Container {
let mut query = self.selection.select("exec"); let mut query = self.selection.select("exec");
if let Some(opts) = opts { if let Some(opts) = opts {
@ -219,7 +241,15 @@ impl Container {
query.execute(&graphql_client(&self.conn)) query.execute(&graphql_client(&self.conn))
} }
pub fn export( pub fn export(&self, path: impl Into<String>) -> eyre::Result<bool> {
let mut query = self.selection.select("export");
query = query.arg("path", path.into());
query.execute(&graphql_client(&self.conn))
}
pub fn export_opts(
&self, &self,
path: impl Into<String>, path: impl Into<String>,
opts: Option<ContainerExportOpts>, opts: Option<ContainerExportOpts>,
@ -292,7 +322,19 @@ impl Container {
query.execute(&graphql_client(&self.conn)) query.execute(&graphql_client(&self.conn))
} }
pub fn pipeline( pub fn pipeline(&self, name: impl Into<String>) -> Container {
let mut query = self.selection.select("pipeline");
query = query.arg("name", name.into());
return Container {
proc: self.proc.clone(),
selection: query,
conn: self.conn.clone(),
};
}
pub fn pipeline_opts(
&self, &self,
name: impl Into<String>, name: impl Into<String>,
opts: Option<ContainerPipelineOpts>, opts: Option<ContainerPipelineOpts>,
@ -317,7 +359,15 @@ impl Container {
query.execute(&graphql_client(&self.conn)) query.execute(&graphql_client(&self.conn))
} }
pub fn publish( pub fn publish(&self, address: impl Into<String>) -> eyre::Result<String> {
let mut query = self.selection.select("publish");
query = query.arg("address", address.into());
query.execute(&graphql_client(&self.conn))
}
pub fn publish_opts(
&self, &self,
address: impl Into<String>, address: impl Into<String>,
opts: Option<ContainerPublishOpts>, opts: Option<ContainerPublishOpts>,
@ -357,7 +407,17 @@ impl Container {
query.execute(&graphql_client(&self.conn)) query.execute(&graphql_client(&self.conn))
} }
pub fn with_default_args(&self, opts: Option<ContainerWithDefaultArgsOpts>) -> Container { pub fn with_default_args(&self) -> Container {
let mut query = self.selection.select("withDefaultArgs");
return Container {
proc: self.proc.clone(),
selection: query,
conn: self.conn.clone(),
};
}
pub fn with_default_args_opts(&self, opts: Option<ContainerWithDefaultArgsOpts>) -> Container {
let mut query = self.selection.select("withDefaultArgs"); let mut query = self.selection.select("withDefaultArgs");
if let Some(opts) = opts { if let Some(opts) = opts {
@ -372,7 +432,20 @@ impl Container {
conn: self.conn.clone(), conn: self.conn.clone(),
}; };
} }
pub fn with_directory( pub fn with_directory(&self, path: impl Into<String>, directory: DirectoryId) -> Container {
let mut query = self.selection.select("withDirectory");
query = query.arg("path", path.into());
query = query.arg("directory", directory);
return Container {
proc: self.proc.clone(),
selection: query,
conn: self.conn.clone(),
};
}
pub fn with_directory_opts(
&self, &self,
path: impl Into<String>, path: impl Into<String>,
directory: DirectoryId, directory: DirectoryId,
@ -427,7 +500,22 @@ impl Container {
conn: self.conn.clone(), conn: self.conn.clone(),
}; };
} }
pub fn with_exec( pub fn with_exec(&self, args: Vec<impl Into<String>>) -> Container {
let mut query = self.selection.select("withExec");
query = query.arg(
"args",
args.into_iter().map(|i| i.into()).collect::<Vec<String>>(),
);
return Container {
proc: self.proc.clone(),
selection: query,
conn: self.conn.clone(),
};
}
pub fn with_exec_opts(
&self, &self,
args: Vec<impl Into<String>>, args: Vec<impl Into<String>>,
opts: Option<ContainerWithExecOpts>, opts: Option<ContainerWithExecOpts>,
@ -473,7 +561,20 @@ impl Container {
conn: self.conn.clone(), conn: self.conn.clone(),
}; };
} }
pub fn with_file( pub fn with_file(&self, path: impl Into<String>, source: FileId) -> Container {
let mut query = self.selection.select("withFile");
query = query.arg("path", path.into());
query = query.arg("source", source);
return Container {
proc: self.proc.clone(),
selection: query,
conn: self.conn.clone(),
};
}
pub fn with_file_opts(
&self, &self,
path: impl Into<String>, path: impl Into<String>,
source: FileId, source: FileId,
@ -507,7 +608,20 @@ impl Container {
conn: self.conn.clone(), conn: self.conn.clone(),
}; };
} }
pub fn with_mounted_cache( pub fn with_mounted_cache(&self, path: impl Into<String>, cache: CacheId) -> Container {
let mut query = self.selection.select("withMountedCache");
query = query.arg("path", path.into());
query = query.arg("cache", cache);
return Container {
proc: self.proc.clone(),
selection: query,
conn: self.conn.clone(),
};
}
pub fn with_mounted_cache_opts(
&self, &self,
path: impl Into<String>, path: impl Into<String>,
cache: CacheId, cache: CacheId,
@ -583,7 +697,19 @@ impl Container {
conn: self.conn.clone(), conn: self.conn.clone(),
}; };
} }
pub fn with_new_file( pub fn with_new_file(&self, path: impl Into<String>) -> Container {
let mut query = self.selection.select("withNewFile");
query = query.arg("path", path.into());
return Container {
proc: self.proc.clone(),
selection: query,
conn: self.conn.clone(),
};
}
pub fn with_new_file_opts(
&self, &self,
path: impl Into<String>, path: impl Into<String>,
opts: Option<ContainerWithNewFileOpts>, opts: Option<ContainerWithNewFileOpts>,
@ -815,7 +941,17 @@ impl Directory {
conn: self.conn.clone(), conn: self.conn.clone(),
}; };
} }
pub fn docker_build(&self, opts: Option<DirectoryDockerBuildOpts>) -> Container { pub fn docker_build(&self) -> Container {
let mut query = self.selection.select("dockerBuild");
return Container {
proc: self.proc.clone(),
selection: query,
conn: self.conn.clone(),
};
}
pub fn docker_build_opts(&self, opts: Option<DirectoryDockerBuildOpts>) -> Container {
let mut query = self.selection.select("dockerBuild"); let mut query = self.selection.select("dockerBuild");
if let Some(opts) = opts { if let Some(opts) = opts {
@ -839,7 +975,13 @@ impl Directory {
conn: self.conn.clone(), conn: self.conn.clone(),
}; };
} }
pub fn entries(&self, opts: Option<DirectoryEntriesOpts>) -> eyre::Result<Vec<String>> { pub fn entries(&self) -> eyre::Result<Vec<String>> {
let mut query = self.selection.select("entries");
query.execute(&graphql_client(&self.conn))
}
pub fn entries_opts(&self, opts: Option<DirectoryEntriesOpts>) -> eyre::Result<Vec<String>> {
let mut query = self.selection.select("entries"); let mut query = self.selection.select("entries");
if let Some(opts) = opts { if let Some(opts) = opts {
@ -884,7 +1026,19 @@ impl Directory {
conn: self.conn.clone(), conn: self.conn.clone(),
}; };
} }
pub fn pipeline( pub fn pipeline(&self, name: impl Into<String>) -> Directory {
let mut query = self.selection.select("pipeline");
query = query.arg("name", name.into());
return Directory {
proc: self.proc.clone(),
selection: query,
conn: self.conn.clone(),
};
}
pub fn pipeline_opts(
&self, &self,
name: impl Into<String>, name: impl Into<String>,
opts: Option<DirectoryPipelineOpts>, opts: Option<DirectoryPipelineOpts>,
@ -904,7 +1058,20 @@ impl Directory {
conn: self.conn.clone(), conn: self.conn.clone(),
}; };
} }
pub fn with_directory( pub fn with_directory(&self, path: impl Into<String>, directory: DirectoryId) -> Directory {
let mut query = self.selection.select("withDirectory");
query = query.arg("path", path.into());
query = query.arg("directory", directory);
return Directory {
proc: self.proc.clone(),
selection: query,
conn: self.conn.clone(),
};
}
pub fn with_directory_opts(
&self, &self,
path: impl Into<String>, path: impl Into<String>,
directory: DirectoryId, directory: DirectoryId,
@ -929,7 +1096,20 @@ impl Directory {
conn: self.conn.clone(), conn: self.conn.clone(),
}; };
} }
pub fn with_file( pub fn with_file(&self, path: impl Into<String>, source: FileId) -> Directory {
let mut query = self.selection.select("withFile");
query = query.arg("path", path.into());
query = query.arg("source", source);
return Directory {
proc: self.proc.clone(),
selection: query,
conn: self.conn.clone(),
};
}
pub fn with_file_opts(
&self, &self,
path: impl Into<String>, path: impl Into<String>,
source: FileId, source: FileId,
@ -951,7 +1131,19 @@ impl Directory {
conn: self.conn.clone(), conn: self.conn.clone(),
}; };
} }
pub fn with_new_directory( pub fn with_new_directory(&self, path: impl Into<String>) -> Directory {
let mut query = self.selection.select("withNewDirectory");
query = query.arg("path", path.into());
return Directory {
proc: self.proc.clone(),
selection: query,
conn: self.conn.clone(),
};
}
pub fn with_new_directory_opts(
&self, &self,
path: impl Into<String>, path: impl Into<String>,
opts: Option<DirectoryWithNewDirectoryOpts>, opts: Option<DirectoryWithNewDirectoryOpts>,
@ -971,7 +1163,20 @@ impl Directory {
conn: self.conn.clone(), conn: self.conn.clone(),
}; };
} }
pub fn with_new_file( pub fn with_new_file(&self, path: impl Into<String>, contents: impl Into<String>) -> Directory {
let mut query = self.selection.select("withNewFile");
query = query.arg("path", path.into());
query = query.arg("contents", contents.into());
return Directory {
proc: self.proc.clone(),
selection: query,
conn: self.conn.clone(),
};
}
pub fn with_new_file_opts(
&self, &self,
path: impl Into<String>, path: impl Into<String>,
contents: impl Into<String>, contents: impl Into<String>,
@ -1115,7 +1320,17 @@ impl GitRef {
query.execute(&graphql_client(&self.conn)) query.execute(&graphql_client(&self.conn))
} }
pub fn tree(&self, opts: Option<GitRefTreeOpts>) -> Directory { pub fn tree(&self) -> Directory {
let mut query = self.selection.select("tree");
return Directory {
proc: self.proc.clone(),
selection: query,
conn: self.conn.clone(),
};
}
pub fn tree_opts(&self, opts: Option<GitRefTreeOpts>) -> Directory {
let mut query = self.selection.select("tree"); let mut query = self.selection.select("tree");
if let Some(opts) = opts { if let Some(opts) = opts {
@ -1207,7 +1422,23 @@ pub struct HostWorkdirOpts<'a> {
} }
impl Host { impl Host {
pub fn directory(&self, path: impl Into<String>, opts: Option<HostDirectoryOpts>) -> Directory { pub fn directory(&self, path: impl Into<String>) -> Directory {
let mut query = self.selection.select("directory");
query = query.arg("path", path.into());
return Directory {
proc: self.proc.clone(),
selection: query,
conn: self.conn.clone(),
};
}
pub fn directory_opts(
&self,
path: impl Into<String>,
opts: Option<HostDirectoryOpts>,
) -> Directory {
let mut query = self.selection.select("directory"); let mut query = self.selection.select("directory");
query = query.arg("path", path.into()); query = query.arg("path", path.into());
@ -1248,7 +1479,17 @@ impl Host {
conn: self.conn.clone(), conn: self.conn.clone(),
}; };
} }
pub fn workdir(&self, opts: Option<HostWorkdirOpts>) -> Directory { pub fn workdir(&self) -> Directory {
let mut query = self.selection.select("workdir");
return Directory {
proc: self.proc.clone(),
selection: query,
conn: self.conn.clone(),
};
}
pub fn workdir_opts(&self, opts: Option<HostWorkdirOpts>) -> Directory {
let mut query = self.selection.select("workdir"); let mut query = self.selection.select("workdir");
if let Some(opts) = opts { if let Some(opts) = opts {
@ -1399,7 +1640,17 @@ impl Query {
conn: self.conn.clone(), conn: self.conn.clone(),
}; };
} }
pub fn container(&self, opts: Option<QueryContainerOpts>) -> Container { pub fn container(&self) -> Container {
let mut query = self.selection.select("container");
return Container {
proc: self.proc.clone(),
selection: query,
conn: self.conn.clone(),
};
}
pub fn container_opts(&self, opts: Option<QueryContainerOpts>) -> Container {
let mut query = self.selection.select("container"); let mut query = self.selection.select("container");
if let Some(opts) = opts { if let Some(opts) = opts {
@ -1422,7 +1673,17 @@ impl Query {
query.execute(&graphql_client(&self.conn)) query.execute(&graphql_client(&self.conn))
} }
pub fn directory(&self, opts: Option<QueryDirectoryOpts>) -> Directory { pub fn directory(&self) -> Directory {
let mut query = self.selection.select("directory");
return Directory {
proc: self.proc.clone(),
selection: query,
conn: self.conn.clone(),
};
}
pub fn directory_opts(&self, opts: Option<QueryDirectoryOpts>) -> Directory {
let mut query = self.selection.select("directory"); let mut query = self.selection.select("directory");
if let Some(opts) = opts { if let Some(opts) = opts {
@ -1448,7 +1709,19 @@ impl Query {
conn: self.conn.clone(), conn: self.conn.clone(),
}; };
} }
pub fn git(&self, url: impl Into<String>, opts: Option<QueryGitOpts>) -> GitRepository { pub fn git(&self, url: impl Into<String>) -> GitRepository {
let mut query = self.selection.select("git");
query = query.arg("url", url.into());
return GitRepository {
proc: self.proc.clone(),
selection: query,
conn: self.conn.clone(),
};
}
pub fn git_opts(&self, url: impl Into<String>, opts: Option<QueryGitOpts>) -> GitRepository {
let mut query = self.selection.select("git"); let mut query = self.selection.select("git");
query = query.arg("url", url.into()); query = query.arg("url", url.into());
@ -1484,7 +1757,19 @@ impl Query {
conn: self.conn.clone(), conn: self.conn.clone(),
}; };
} }
pub fn pipeline(&self, name: impl Into<String>, opts: Option<QueryPipelineOpts>) -> Query { pub fn pipeline(&self, name: impl Into<String>) -> Query {
let mut query = self.selection.select("pipeline");
query = query.arg("name", name.into());
return Query {
proc: self.proc.clone(),
selection: query,
conn: self.conn.clone(),
};
}
pub fn pipeline_opts(&self, name: impl Into<String>, opts: Option<QueryPipelineOpts>) -> Query {
let mut query = self.selection.select("pipeline"); let mut query = self.selection.select("pipeline");
query = query.arg("name", name.into()); query = query.arg("name", name.into());
@ -1522,7 +1807,17 @@ impl Query {
conn: self.conn.clone(), conn: self.conn.clone(),
}; };
} }
pub fn socket(&self, opts: Option<QuerySocketOpts>) -> Socket { pub fn socket(&self) -> Socket {
let mut query = self.selection.select("socket");
return Socket {
proc: self.proc.clone(),
selection: query,
conn: self.conn.clone(),
};
}
pub fn socket_opts(&self, opts: Option<QuerySocketOpts>) -> Socket {
let mut query = self.selection.select("socket"); let mut query = self.selection.select("socket");
if let Some(opts) = opts { if let Some(opts) = opts {

View File

@ -4,10 +4,10 @@ use dagger_sdk::{connect, ContainerExecOptsBuilder};
fn test_example_container() { fn test_example_container() {
let client = connect().unwrap(); let client = connect().unwrap();
let alpine = client.container(None).from("alpine:3.16.2"); let alpine = client.container().from("alpine:3.16.2");
let out = alpine let out = alpine
.exec(Some( .exec_opts(Some(
ContainerExecOptsBuilder::default() ContainerExecOptsBuilder::default()
.args(vec!["cat", "/etc/alpine-release"]) .args(vec!["cat", "/etc/alpine-release"])
.build() .build()