Compare commits

...

18 Commits

Author SHA1 Message Date
f72731807d Release dagger-sdk v0.2.5, dagger-codegen v0.2.4 2023-02-19 18:00:27 +01:00
c627595fd2 fix: cargo clippy 2023-02-19 18:00:04 +01:00
3f13c40ab8 fix: roadmap item api stabilization 2023-02-19 18:00:04 +01:00
f29ff836cf feat(sdk): without Some in _opts functions
Option has been removed as a wrapper around opts. This makes it much
more convenient to use

```rust
client.container_opts(Some(ContainerOpts{}))
// ->
client.container_opts(ContainerOpts{})
```

The same options are still available, either an empty object can be
passed, or a non _opts function can be used
2023-02-19 18:00:04 +01:00
9762da895a 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
2023-02-19 18:00:04 +01:00
02006d40fc fix(sdk): without phantom data 2023-02-19 18:00:04 +01:00
94336d0637 feat(sdk): move to &str instead of String and introduce builder.
This will make the api much easier to use, as we can now rely on ""
instead of "".into() for normal string values.

Introduced builder as well, which makes it much easier to use *Opts, as
it can handle the building of that, and get the benefits from String ->
&str, as that is currently not allowed for optional values
2023-02-19 18:00:04 +01:00
6e2292cf11 fix(sdk): dependencies 2023-02-19 15:39:10 +01:00
cc81124f89 Release dagger-sdk v0.2.4 2023-02-19 15:34:07 +01:00
7d04ab1240 fix(sdk): readme dagger-rs -> dagger-sdk 2023-02-19 15:33:48 +01:00
92350306b3 Release dagger-sdk v0.2.3, dagger-codegen v0.2.3, dagger-rs v0.2.9 2023-02-19 15:30:08 +01:00
19ed6c267f feat(sdk): re-export through lib.rs
this means that you can now use dagger_sdk::connect() instead of
dagger_sdk::client::connect();
2023-02-19 15:29:03 +01:00
de063eae85 feat(sdk): with return result instead of unwrap 2023-02-19 15:29:03 +01:00
5d66736990 feat(core,sdk): remove unnecessary option returns 2023-02-19 15:29:03 +01:00
9ada74960a feat(ci): add gha caching 2023-02-19 14:41:23 +01:00
90ab2e2b7d feat: clear release-cycle roadmap item 2023-02-19 14:37:23 +01:00
818ef6f74d feat(ci): lint pr 2023-02-19 12:57:32 +01:00
691ecfbf52 feat(ci): ci with dagger v0.2.2 2023-02-19 12:44:03 +01:00
32 changed files with 1507 additions and 771 deletions

View File

@@ -8,6 +8,7 @@ env:
CARGO_TERM_COLOR: always CARGO_TERM_COLOR: always
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
_EXPERIMENTAL_DAGGER_CACHE_CONFIG: type=gha;mode=max
jobs: jobs:
deploy: deploy:
runs-on: ubuntu-latest runs-on: ubuntu-latest

15
.github/workflows/lint-pr.yml vendored Normal file
View File

@@ -0,0 +1,15 @@
name: "Lint PR"
on:
pull_request_target:
types:
- opened
- edited
- synchronize
jobs:
main:
name: Validate PR title
runs-on: ubuntu-latest
steps:
- uses: amannn/action-semantic-pull-request@v5
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

View File

@@ -5,6 +5,32 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## v0.2.9 (2023-02-19)
### New Features
- <csr-id-19ed6c267f779b72430422c463ceed553f6fc618/> re-export through lib.rs
this means that you can now use dagger_sdk::connect() instead of
dagger_sdk::client::connect();
### Commit Statistics
<csr-read-only-do-not-edit/>
- 1 commit contributed to the release.
- 1 commit was understood as [conventional](https://www.conventionalcommits.org).
- 0 issues like '(#ID)' were seen in commit messages
### Commit Details
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
* **Uncategorized**
- re-export through lib.rs ([`19ed6c2`](https://github.com/kjuulh/dagger-rs/commit/19ed6c267f779b72430422c463ceed553f6fc618))
</details>
## v0.2.8 (2023-02-19) ## v0.2.8 (2023-02-19)
### New Features ### New Features

93
Cargo.lock generated
View File

@@ -114,7 +114,7 @@ version = "0.1.0"
dependencies = [ dependencies = [
"clap", "clap",
"color-eyre", "color-eyre",
"dagger-sdk 0.2.1", "dagger-sdk 0.2.2",
"eyre", "eyre",
] ]
@@ -245,7 +245,7 @@ dependencies = [
[[package]] [[package]]
name = "dagger-codegen" name = "dagger-codegen"
version = "0.2.2" version = "0.2.4"
dependencies = [ dependencies = [
"convert_case", "convert_case",
"dagger-core 0.2.2", "dagger-core 0.2.2",
@@ -259,9 +259,7 @@ dependencies = [
[[package]] [[package]]
name = "dagger-core" name = "dagger-core"
version = "0.2.1" version = "0.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4805375918d0605477dac436be1c4d13a46c6f3fa1383b8eb624a31688a4b99b"
dependencies = [ dependencies = [
"clap", "clap",
"dirs", "dirs",
@@ -284,6 +282,8 @@ dependencies = [
[[package]] [[package]]
name = "dagger-core" name = "dagger-core"
version = "0.2.2" version = "0.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7efe798e1fe0d882e335aab8928d5deaafb0d27869b69ec7e9e4686548e11753"
dependencies = [ dependencies = [
"clap", "clap",
"dirs", "dirs",
@@ -305,7 +305,7 @@ dependencies = [
[[package]] [[package]]
name = "dagger-rs" name = "dagger-rs"
version = "0.2.8" version = "0.2.9"
dependencies = [ dependencies = [
"clap", "clap",
"color-eyre", "color-eyre",
@@ -330,12 +330,12 @@ dependencies = [
[[package]] [[package]]
name = "dagger-sdk" name = "dagger-sdk"
version = "0.2.1" version = "0.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "91342638dfdcd44ca5d3a2cc1b962e3f2c0e461487e90fe62972ef31df74c061" checksum = "d1562df6d7d47fbb891331896ec9c04da1db129c1a9f073c40c33ab918f06e99"
dependencies = [ dependencies = [
"base64", "base64",
"dagger-core 0.2.1", "dagger-core 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
"eyre", "eyre",
"futures", "futures",
"genco", "genco",
@@ -348,10 +348,11 @@ dependencies = [
[[package]] [[package]]
name = "dagger-sdk" name = "dagger-sdk"
version = "0.2.2" version = "0.2.5"
dependencies = [ dependencies = [
"base64", "base64",
"dagger-core 0.2.2", "dagger-core 0.2.2",
"derive_builder",
"eyre", "eyre",
"futures", "futures",
"genco", "genco",
@@ -363,6 +364,72 @@ dependencies = [
"tokio", "tokio",
] ]
[[package]]
name = "darling"
version = "0.14.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c0808e1bd8671fb44a113a14e13497557533369847788fa2ae912b6ebfce9fa8"
dependencies = [
"darling_core",
"darling_macro",
]
[[package]]
name = "darling_core"
version = "0.14.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "001d80444f28e193f30c2f293455da62dcf9a6b29918a4253152ae2b1de592cb"
dependencies = [
"fnv",
"ident_case",
"proc-macro2",
"quote",
"strsim",
"syn",
]
[[package]]
name = "darling_macro"
version = "0.14.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b36230598a2d5de7ec1c6f51f72d8a99a9208daff41de2084d06e3fd3ea56685"
dependencies = [
"darling_core",
"quote",
"syn",
]
[[package]]
name = "derive_builder"
version = "0.12.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8d67778784b508018359cbc8696edb3db78160bab2c2a28ba7f56ef6932997f8"
dependencies = [
"derive_builder_macro",
]
[[package]]
name = "derive_builder_core"
version = "0.12.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c11bdc11a0c47bc7d37d582b5285da6849c96681023680b906673c5707af7b0f"
dependencies = [
"darling",
"proc-macro2",
"quote",
"syn",
]
[[package]]
name = "derive_builder_macro"
version = "0.12.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ebcda35c7a396850a55ffeac740804b40ffec779b98fffbb1738f4033f0ee79e"
dependencies = [
"derive_builder_core",
"syn",
]
[[package]] [[package]]
name = "diff" name = "diff"
version = "0.1.13" version = "0.1.13"
@@ -839,6 +906,12 @@ dependencies = [
"tokio-native-tls", "tokio-native-tls",
] ]
[[package]]
name = "ident_case"
version = "1.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39"
[[package]] [[package]]
name = "idna" name = "idna"
version = "0.3.0" version = "0.3.0"

View File

@@ -1,6 +1,6 @@
[package] [package]
name = "dagger-rs" name = "dagger-rs"
version = "0.2.8" version = "0.2.9"
edition = "2021" edition = "2021"
readme = "README.md" readme = "README.md"
license-file = "LICENSE.MIT" license-file = "LICENSE.MIT"
@@ -19,7 +19,7 @@ members = [
] ]
[dependencies] [dependencies]
dagger-codegen = { path = "crates/dagger-codegen", version = "^0.2.2" } dagger-codegen = { path = "crates/dagger-codegen", version = "^0.2.3" }
dagger-core = { path = "crates/dagger-core", version = "^0.2.2" } dagger-core = { path = "crates/dagger-core", version = "^0.2.2" }
clap = "4.1.6" clap = "4.1.6"

View File

@@ -21,8 +21,8 @@ See [dagger-sdk](./crates/dagger-sdk/README.md)
- [x] Context - [x] Context
- [x] Deserializer for nested response (bind) - [x] Deserializer for nested response (bind)
- [x] Add codegen to hook into querier - [x] Add codegen to hook into querier
- [ ] fix build / release cycle - [x] fix build / release cycle
- [ ] general api stabilisation - [x] general api stabilisation
- [x] document usage - [x] document usage
- [ ] make async variant - [ ] make async variant

View File

@@ -8,5 +8,5 @@ edition = "2021"
[dependencies] [dependencies]
clap = "4.1.6" clap = "4.1.6"
color-eyre = "0.6.2" color-eyre = "0.6.2"
dagger-sdk = "0.2.1" dagger-sdk = "0.2.2"
eyre = "0.6.8" eyre = "0.6.8"

View File

@@ -28,7 +28,7 @@ fn main() -> eyre::Result<()> {
} }
} }
fn release(client: Arc<Query>, subm: &clap::ArgMatches) -> Result<(), color_eyre::Report> { fn release(client: Arc<Query>, _subm: &clap::ArgMatches) -> Result<(), color_eyre::Report> {
let src_dir = client.host().directory( let src_dir = client.host().directory(
".".into(), ".".into(),
Some(HostDirectoryOpts { Some(HostDirectoryOpts {

View File

@@ -5,6 +5,97 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## v0.2.4 (2023-02-19)
### New Features
- <csr-id-f29ff836cfd72d5e051ca6a71a230ba1e9933091/> without Some in _opts functions
Option has been removed as a wrapper around opts. This makes it much
more convenient to use
```rust
client.container_opts(Some(ContainerOpts{}))
// ->
client.container_opts(ContainerOpts{})
```
The same options are still available, either an empty object can be
passed, or a non _opts function can be used
- <csr-id-9762da895a164e30c5dc60e89a83e934ceae47ab/> 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
- <csr-id-94336d06378f035464e233b921dc3858070f582d/> move to &str instead of String and introduce builder.
This will make the api much easier to use, as we can now rely on ""
instead of "".into() for normal string values.
Introduced builder as well, which makes it much easier to use *Opts, as
it can handle the building of that, and get the benefits from String ->
&str, as that is currently not allowed for optional values
### Bug Fixes
- <csr-id-c627595fd2695e236924175d137c42f1480ccd6b/> cargo clippy
- <csr-id-02006d40fc2c0383e0412c15c36db9af7eda991f/> without phantom data
### Commit Statistics
<csr-read-only-do-not-edit/>
- 5 commits contributed to the release.
- 5 commits were understood as [conventional](https://www.conventionalcommits.org).
- 0 issues like '(#ID)' were seen in commit messages
### Commit Details
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
* **Uncategorized**
- cargo clippy ([`c627595`](https://github.com/kjuulh/dagger-rs/commit/c627595fd2695e236924175d137c42f1480ccd6b))
- without Some in _opts functions ([`f29ff83`](https://github.com/kjuulh/dagger-rs/commit/f29ff836cfd72d5e051ca6a71a230ba1e9933091))
- with _opts methods ([`9762da8`](https://github.com/kjuulh/dagger-rs/commit/9762da895a164e30c5dc60e89a83e934ceae47ab))
- without phantom data ([`02006d4`](https://github.com/kjuulh/dagger-rs/commit/02006d40fc2c0383e0412c15c36db9af7eda991f))
- move to &str instead of String and introduce builder. ([`94336d0`](https://github.com/kjuulh/dagger-rs/commit/94336d06378f035464e233b921dc3858070f582d))
</details>
## v0.2.3 (2023-02-19)
### New Features
- <csr-id-de063eae858eb3335d2558a57ee6a88689635200/> with return result instead of unwrap
- <csr-id-5d667369900a47d3a6015cd3814c240bc5c54436/> remove unnecessary option returns
### Commit Statistics
<csr-read-only-do-not-edit/>
- 3 commits contributed to the release.
- 2 commits were understood as [conventional](https://www.conventionalcommits.org).
- 0 issues like '(#ID)' were seen in commit messages
### Commit Details
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
* **Uncategorized**
- Release dagger-sdk v0.2.3, dagger-codegen v0.2.3, dagger-rs v0.2.9 ([`9235030`](https://github.com/kjuulh/dagger-rs/commit/92350306b3f0da40b4fc6dcaffcd90b891e83f70))
- with return result instead of unwrap ([`de063ea`](https://github.com/kjuulh/dagger-rs/commit/de063eae858eb3335d2558a57ee6a88689635200))
- remove unnecessary option returns ([`5d66736`](https://github.com/kjuulh/dagger-rs/commit/5d667369900a47d3a6015cd3814c240bc5c54436))
</details>
## v0.2.2 (2023-02-19) ## v0.2.2 (2023-02-19)
### New Features ### New Features
@@ -15,7 +106,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
<csr-read-only-do-not-edit/> <csr-read-only-do-not-edit/>
- 1 commit contributed to the release. - 2 commits contributed to the release.
- 1 commit was understood as [conventional](https://www.conventionalcommits.org). - 1 commit was understood as [conventional](https://www.conventionalcommits.org).
- 0 issues like '(#ID)' were seen in commit messages - 0 issues like '(#ID)' were seen in commit messages
@@ -26,6 +117,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
<details><summary>view details</summary> <details><summary>view details</summary>
* **Uncategorized** * **Uncategorized**
- Release dagger-core v0.2.2, dagger-codegen v0.2.2, dagger-rs v0.2.8 ([`1638f15`](https://github.com/kjuulh/dagger-rs/commit/1638f15fba9d16512e8452f87b908d6dce417cd9))
- update to dagger v0.3.12 ([`6e5f407`](https://github.com/kjuulh/dagger-rs/commit/6e5f4074329ab0462445b31d4153f8497c483438)) - update to dagger v0.3.12 ([`6e5f407`](https://github.com/kjuulh/dagger-rs/commit/6e5f4074329ab0462445b31d4153f8497c483438))
</details> </details>

View File

@@ -1,6 +1,6 @@
[package] [package]
name = "dagger-codegen" name = "dagger-codegen"
version = "0.2.2" version = "0.2.4"
edition = "2021" edition = "2021"
readme = "README.md" readme = "README.md"
license-file = "LICENSE.MIT" license-file = "LICENSE.MIT"

View File

@@ -6,8 +6,8 @@ use eyre::ContextCompat;
use crate::utility::OptionExt; use crate::utility::OptionExt;
pub trait FormatTypeFuncs { pub trait FormatTypeFuncs {
fn format_kind_list(&self, representation: &str) -> String; fn format_kind_list(&self, representation: &str, input: bool, immutable: bool) -> String;
fn format_kind_scalar_string(&self, representation: &str) -> String; fn format_kind_scalar_string(&self, representation: &str, input: bool) -> String;
fn format_kind_scalar_int(&self, representation: &str) -> String; fn format_kind_scalar_int(&self, representation: &str) -> String;
fn format_kind_scalar_float(&self, representation: &str) -> String; fn format_kind_scalar_float(&self, representation: &str) -> String;
fn format_kind_scalar_boolean(&self, representation: &str) -> String; fn format_kind_scalar_boolean(&self, representation: &str) -> String;
@@ -36,14 +36,18 @@ impl CommonFunctions {
} }
pub fn format_input_type(&self, t: &TypeRef) -> String { pub fn format_input_type(&self, t: &TypeRef) -> String {
self.format_type(t, true) self.format_type(t, true, false)
} }
pub fn format_output_type(&self, t: &TypeRef) -> String { pub fn format_output_type(&self, t: &TypeRef) -> String {
self.format_type(t, false) self.format_type(t, false, false)
} }
fn format_type(&self, t: &TypeRef, input: bool) -> String { pub fn format_immutable_input_type(&self, t: &TypeRef) -> String {
self.format_type(t, true, true)
}
fn format_type(&self, t: &TypeRef, input: bool, immutable: bool) -> String {
let mut representation = String::new(); let mut representation = String::new();
let mut r = Some(t.clone()); let mut r = Some(t.clone());
while r.is_some() { while r.is_some() {
@@ -57,9 +61,14 @@ impl CommonFunctions {
Scalar::Float => self Scalar::Float => self
.format_type_funcs .format_type_funcs
.format_kind_scalar_float(&mut representation), .format_kind_scalar_float(&mut representation),
Scalar::String => self Scalar::String => {
.format_type_funcs if immutable {
.format_kind_scalar_string(&mut representation), "&'a str".into()
} else {
self.format_type_funcs
.format_kind_scalar_string(&mut representation, input)
}
}
Scalar::Boolean => self Scalar::Boolean => self
.format_type_funcs .format_type_funcs
.format_kind_scalar_boolean(&mut representation), .format_kind_scalar_boolean(&mut representation),
@@ -87,12 +96,15 @@ impl CommonFunctions {
.as_ref() .as_ref()
.map(|t| t.clone()) .map(|t| t.clone())
.map(|t| *t) .map(|t| *t)
.map(|t| self.format_type(&t, input)) .map(|t| self.format_type(&t, input, immutable))
.context("could not get inner type of list") .context("could not get inner type of list")
.unwrap(); .unwrap();
representation = representation = self.format_type_funcs.format_kind_list(
self.format_type_funcs.format_kind_list(&mut inner_type); &mut inner_type,
input,
immutable,
);
return representation; return representation;
} }

View File

@@ -5,13 +5,17 @@ use super::functions::format_name;
pub struct FormatTypeFunc; pub struct FormatTypeFunc;
impl FormatTypeFuncs for FormatTypeFunc { impl FormatTypeFuncs for FormatTypeFunc {
fn format_kind_list(&self, representation: &str) -> String { fn format_kind_list(&self, representation: &str, _input: bool, _immutable: bool) -> String {
format!("Vec<{}>", representation) format!("Vec<{}>", representation)
} }
fn format_kind_scalar_string(&self, representation: &str) -> String { fn format_kind_scalar_string(&self, representation: &str, input: bool) -> String {
let mut rep = representation.to_string(); let mut rep = representation.to_string();
rep.push_str("String"); if input {
rep.push_str("impl Into<String>");
} else {
rep.push_str("String");
}
rep rep
} }

View File

@@ -1,12 +1,12 @@
use convert_case::{Case, Casing}; use convert_case::{Case, Casing};
use dagger_core::introspection::FullTypeFields; use dagger_core::introspection::{FullTypeFields, TypeRef};
use genco::prelude::rust; use genco::prelude::rust;
use genco::quote; 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_of_objects, type_ref_is_object, type_field_has_optional, type_ref_is_list, type_ref_is_list_of_objects, type_ref_is_object,
type_ref_is_optional, CommonFunctions, type_ref_is_optional, type_ref_is_scalar, CommonFunctions, Scalar,
}; };
use crate::utility::OptionExt; use crate::utility::OptionExt;
@@ -37,20 +37,46 @@ pub fn format_function(funcs: &CommonFunctions, field: &FullTypeFields) -> Optio
let output_type = field let output_type = field
.type_ .type_
.pipe(|t| &t.type_ref) .pipe(|t| &t.type_ref)
.pipe(|t| funcs.format_output_type(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> {
@@ -66,8 +92,42 @@ fn render_required_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_scalar(&s.input_value.type_) {
if let Scalar::String =
Scalar::from(&*s.input_value.type_.of_type.as_ref().unwrap().clone())
{
return Some(quote! {
query = query.arg($(quoted(name)), $(&n).into());
});
}
}
if type_ref_is_list(&s.input_value.type_) {
let inner = *s
.input_value
.type_
.of_type
.as_ref()
.unwrap()
.clone()
.of_type
.as_ref()
.unwrap()
.clone();
println!("type: {:?}", inner);
if type_ref_is_scalar(&inner) {
if let Scalar::String =
Scalar::from(&*inner.of_type.as_ref().unwrap().clone())
{
return Some(quote! {
query = query.arg($(quoted(name)), $(&n).into_iter().map(|i| i.into()).collect::<Vec<String>>());
});
}
}
}
Some(quote! { Some(quote! {
query = query.arg($(quoted(name)), $(n)).unwrap(); query = query.arg($(quoted(name)), $(n));
}) })
}) })
}) })
@@ -98,7 +158,7 @@ fn render_optional_args(_funcs: &CommonFunctions, field: &FullTypeFields) -> Opt
Some(quote! { Some(quote! {
if let Some($(&n)) = opts.$(&n) { if let Some($(&n)) = opts.$(&n) {
query = query.arg($(quoted(name)), $(&n)).unwrap(); query = query.arg($(quoted(name)), $(&n));
} }
}) })
}) })
@@ -111,9 +171,7 @@ fn render_optional_args(_funcs: &CommonFunctions, field: &FullTypeFields) -> Opt
} }
let required_args = quote! { let required_args = quote! {
if let Some(opts) = opts { $(for arg in args join ($['\r']) => $arg)
$(for arg in args join ($['\r']) => $arg)
}
}; };
Some(required_args) Some(required_args)
@@ -122,6 +180,20 @@ fn render_optional_args(_funcs: &CommonFunctions, field: &FullTypeFields) -> Opt
} }
} }
fn render_output_type(funcs: &CommonFunctions, type_ref: &TypeRef) -> rust::Tokens {
let output_type = funcs.format_output_type(type_ref);
if type_ref_is_object(type_ref) || type_ref_is_list_of_objects(type_ref) {
return quote! {
$(output_type)
};
}
quote! {
eyre::Result<$output_type>
}
}
fn render_execution(funcs: &CommonFunctions, field: &FullTypeFields) -> rust::Tokens { fn render_execution(funcs: &CommonFunctions, field: &FullTypeFields) -> rust::Tokens {
if let Some(true) = field.type_.pipe(|t| type_ref_is_object(&t.type_ref)) { if let Some(true) = field.type_.pipe(|t| type_ref_is_object(&t.type_ref)) {
let output_type = funcs.format_output_type(&field.type_.as_ref().unwrap().type_ref); let output_type = funcs.format_output_type(&field.type_.as_ref().unwrap().type_ref);
@@ -163,11 +235,14 @@ fn render_execution(funcs: &CommonFunctions, field: &FullTypeFields) -> rust::To
let graphql_client = rust::import("crate::client", "graphql_client"); let graphql_client = rust::import("crate::client", "graphql_client");
quote! { quote! {
query.execute(&$graphql_client(&self.conn)).unwrap().unwrap() query.execute(&$graphql_client(&self.conn))
} }
} }
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()
@@ -193,14 +268,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: $(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

@@ -28,7 +28,7 @@ pub fn render_enum(t: &FullType) -> eyre::Result<rust::Tokens> {
let serialize = rust::import("serde", "Serialize"); let serialize = rust::import("serde", "Serialize");
Ok(quote! { Ok(quote! {
#[derive($serialize)] #[derive($serialize, Clone, PartialEq, Debug)]
pub enum $(t.name.as_ref()) { pub enum $(t.name.as_ref()) {
$(render_enum_values(t)) $(render_enum_values(t))
} }

View File

@@ -9,7 +9,7 @@ pub fn render_input(funcs: &CommonFunctions, t: &FullType) -> eyre::Result<rust:
let deserialize = rust::import("serde", "Deserialize"); let deserialize = rust::import("serde", "Deserialize");
let serialize = rust::import("serde", "Serialize"); let serialize = rust::import("serde", "Serialize");
Ok(quote! { Ok(quote! {
#[derive($serialize, $deserialize)] #[derive($serialize, $deserialize, Debug, PartialEq, Clone)]
pub struct $(format_name(t.name.as_ref().unwrap())) { pub struct $(format_name(t.name.as_ref().unwrap())) {
$(render_input_fields(funcs, t.input_fields.as_ref().unwrap_or(&Vec::new()) )) $(render_input_fields(funcs, t.input_fields.as_ref().unwrap_or(&Vec::new()) ))
} }
@@ -33,6 +33,6 @@ pub fn render_input_fields(
pub fn render_input_field(funcs: &CommonFunctions, field: &FullTypeInputFields) -> rust::Tokens { pub fn render_input_field(funcs: &CommonFunctions, field: &FullTypeInputFields) -> rust::Tokens {
quote! { quote! {
pub $(format_struct_name(&field.input_value.name)): $(funcs.format_input_type(&field.input_value.type_)), pub $(format_struct_name(&field.input_value.name)): $(funcs.format_output_type(&field.input_value.type_)),
} }
} }

View File

@@ -1,6 +1,7 @@
use dagger_core::introspection::{FullType, FullTypeFields, FullTypeFieldsArgs}; use dagger_core::introspection::{FullType, FullTypeFields, FullTypeFieldsArgs};
use genco::prelude::rust; use genco::prelude::rust;
use genco::quote; use genco::quote;
use itertools::Itertools;
use crate::functions::{type_ref_is_optional, CommonFunctions}; use crate::functions::{type_ref_is_optional, CommonFunctions};
use crate::rust::functions::{ use crate::rust::functions::{
@@ -61,9 +62,15 @@ fn render_optional_arg(funcs: &CommonFunctions, field: &FullTypeFields) -> Optio
.pipe(|t| render_optional_field_args(funcs, t)) .pipe(|t| render_optional_field_args(funcs, t))
.flatten(); .flatten();
if let Some(fields) = fields { let builder = rust::import("derive_builder", "Builder");
let _phantom_data = rust::import("std::marker", "PhantomData");
if let Some((fields, contains_lifetime)) = fields {
Some(quote! { Some(quote! {
pub struct $output_type { #[derive($builder, Debug, PartialEq)]
pub struct $output_type$(if contains_lifetime => <'a>) {
//#[builder(default, setter(skip))]
//pub marker: $(phantom_data)<&'a ()>,
$fields $fields
} }
}) })
@@ -75,19 +82,28 @@ fn render_optional_arg(funcs: &CommonFunctions, field: &FullTypeFields) -> Optio
fn render_optional_field_args( fn render_optional_field_args(
funcs: &CommonFunctions, funcs: &CommonFunctions,
args: &Vec<&FullTypeFieldsArgs>, args: &Vec<&FullTypeFieldsArgs>,
) -> Option<rust::Tokens> { ) -> Option<(rust::Tokens, bool)> {
if args.len() == 0 { if args.len() == 0 {
return None; return None;
} }
let mut contains_lifetime = false;
let rendered_args = args.into_iter().map(|a| &a.input_value).map(|a| { let rendered_args = args.into_iter().map(|a| &a.input_value).map(|a| {
let type_ = funcs.format_immutable_input_type(&a.type_);
if type_.contains("str") {
contains_lifetime = true;
}
quote! { quote! {
pub $(format_struct_name(&a.name)): Option<$(funcs.format_output_type(&a.type_))>, #[builder(setter(into, strip_option))]
pub $(format_struct_name(&a.name)): Option<$(type_)>,
} }
}); });
Some(quote! { Some((
$(for arg in rendered_args join ($['\r']) => $arg) quote! {
}) $(for arg in rendered_args join ($['\r']) => $arg)
},
contains_lifetime,
))
} }
fn render_functions(funcs: &CommonFunctions, fields: &Vec<FullTypeFields>) -> Option<rust::Tokens> { fn render_functions(funcs: &CommonFunctions, fields: &Vec<FullTypeFields>) -> Option<rust::Tokens> {

View File

@@ -10,7 +10,7 @@ pub fn render_scalar(t: &FullType) -> eyre::Result<rust::Tokens> {
let serialize = rust::import("serde", "Serialize"); let serialize = rust::import("serde", "Serialize");
Ok(quote! { Ok(quote! {
#[derive($serialize, $deserialize)] #[derive($serialize, $deserialize, PartialEq, Debug, Clone)]
pub struct $(t.name.pipe(|n|format_name(n)))(String); pub struct $(t.name.pipe(|n|format_name(n)))(String);
}) })
} }

View File

@@ -5,6 +5,128 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## v0.2.5 (2023-02-19)
### New Features
- <csr-id-f29ff836cfd72d5e051ca6a71a230ba1e9933091/> without Some in _opts functions
Option has been removed as a wrapper around opts. This makes it much
more convenient to use
```rust
client.container_opts(Some(ContainerOpts{}))
// ->
client.container_opts(ContainerOpts{})
```
The same options are still available, either an empty object can be
passed, or a non _opts function can be used
- <csr-id-9762da895a164e30c5dc60e89a83e934ceae47ab/> 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
- <csr-id-94336d06378f035464e233b921dc3858070f582d/> move to &str instead of String and introduce builder.
This will make the api much easier to use, as we can now rely on ""
instead of "".into() for normal string values.
Introduced builder as well, which makes it much easier to use *Opts, as
it can handle the building of that, and get the benefits from String ->
&str, as that is currently not allowed for optional values
### Bug Fixes
- <csr-id-c627595fd2695e236924175d137c42f1480ccd6b/> cargo clippy
- <csr-id-02006d40fc2c0383e0412c15c36db9af7eda991f/> without phantom data
- <csr-id-6e2292cf11942fbd26a52fe4e0fc8471e6eb70a3/> dependencies
### Commit Statistics
<csr-read-only-do-not-edit/>
- 6 commits contributed to the release.
- 6 commits were understood as [conventional](https://www.conventionalcommits.org).
- 0 issues like '(#ID)' were seen in commit messages
### Commit Details
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
* **Uncategorized**
- cargo clippy ([`c627595`](https://github.com/kjuulh/dagger-rs/commit/c627595fd2695e236924175d137c42f1480ccd6b))
- without Some in _opts functions ([`f29ff83`](https://github.com/kjuulh/dagger-rs/commit/f29ff836cfd72d5e051ca6a71a230ba1e9933091))
- with _opts methods ([`9762da8`](https://github.com/kjuulh/dagger-rs/commit/9762da895a164e30c5dc60e89a83e934ceae47ab))
- without phantom data ([`02006d4`](https://github.com/kjuulh/dagger-rs/commit/02006d40fc2c0383e0412c15c36db9af7eda991f))
- move to &str instead of String and introduce builder. ([`94336d0`](https://github.com/kjuulh/dagger-rs/commit/94336d06378f035464e233b921dc3858070f582d))
- dependencies ([`6e2292c`](https://github.com/kjuulh/dagger-rs/commit/6e2292cf11942fbd26a52fe4e0fc8471e6eb70a3))
</details>
## v0.2.4 (2023-02-19)
### Bug Fixes
- <csr-id-7d04ab1240e497e7804fed23a378d28c78f50a0a/> readme dagger-rs -> dagger-sdk
### Commit Statistics
<csr-read-only-do-not-edit/>
- 2 commits contributed to the release.
- 1 commit was understood as [conventional](https://www.conventionalcommits.org).
- 0 issues like '(#ID)' were seen in commit messages
### Commit Details
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
* **Uncategorized**
- Release dagger-sdk v0.2.4 ([`cc81124`](https://github.com/kjuulh/dagger-rs/commit/cc81124f899f44f80c1ee7d1e23a7e02d8cc4b7c))
- readme dagger-rs -> dagger-sdk ([`7d04ab1`](https://github.com/kjuulh/dagger-rs/commit/7d04ab1240e497e7804fed23a378d28c78f50a0a))
</details>
## v0.2.3 (2023-02-19)
### New Features
- <csr-id-19ed6c267f779b72430422c463ceed553f6fc618/> re-export through lib.rs
this means that you can now use dagger_sdk::connect() instead of
dagger_sdk::client::connect();
- <csr-id-de063eae858eb3335d2558a57ee6a88689635200/> with return result instead of unwrap
- <csr-id-5d667369900a47d3a6015cd3814c240bc5c54436/> remove unnecessary option returns
### Commit Statistics
<csr-read-only-do-not-edit/>
- 4 commits contributed to the release.
- 3 commits were understood as [conventional](https://www.conventionalcommits.org).
- 0 issues like '(#ID)' were seen in commit messages
### Commit Details
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
* **Uncategorized**
- Release dagger-sdk v0.2.3, dagger-codegen v0.2.3, dagger-rs v0.2.9 ([`9235030`](https://github.com/kjuulh/dagger-rs/commit/92350306b3f0da40b4fc6dcaffcd90b891e83f70))
- re-export through lib.rs ([`19ed6c2`](https://github.com/kjuulh/dagger-rs/commit/19ed6c267f779b72430422c463ceed553f6fc618))
- with return result instead of unwrap ([`de063ea`](https://github.com/kjuulh/dagger-rs/commit/de063eae858eb3335d2558a57ee6a88689635200))
- remove unnecessary option returns ([`5d66736`](https://github.com/kjuulh/dagger-rs/commit/5d667369900a47d3a6015cd3814c240bc5c54436))
</details>
## v0.2.2 (2023-02-19) ## v0.2.2 (2023-02-19)
### New Features ### New Features
@@ -19,7 +141,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
<csr-read-only-do-not-edit/> <csr-read-only-do-not-edit/>
- 3 commits contributed to the release. - 4 commits contributed to the release.
- 2 commits were understood as [conventional](https://www.conventionalcommits.org). - 2 commits were understood as [conventional](https://www.conventionalcommits.org).
- 0 issues like '(#ID)' were seen in commit messages - 0 issues like '(#ID)' were seen in commit messages
@@ -30,6 +152,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
<details><summary>view details</summary> <details><summary>view details</summary>
* **Uncategorized** * **Uncategorized**
- Release dagger-sdk v0.2.2 ([`e921ba1`](https://github.com/kjuulh/dagger-rs/commit/e921ba13638987ccf5beaa48c4be9be5fd879bd0))
- Release dagger-core v0.2.2, dagger-codegen v0.2.2, dagger-rs v0.2.8 ([`1638f15`](https://github.com/kjuulh/dagger-rs/commit/1638f15fba9d16512e8452f87b908d6dce417cd9)) - Release dagger-core v0.2.2, dagger-codegen v0.2.2, dagger-rs v0.2.8 ([`1638f15`](https://github.com/kjuulh/dagger-rs/commit/1638f15fba9d16512e8452f87b908d6dce417cd9))
- fixed fmt errors ([`10bc6f3`](https://github.com/kjuulh/dagger-rs/commit/10bc6f3846b65cc82c2fb343d8cfe921784bef1b)) - fixed fmt errors ([`10bc6f3`](https://github.com/kjuulh/dagger-rs/commit/10bc6f3846b65cc82c2fb343d8cfe921784bef1b))
- update to dagger v0.3.12 ([`6e5f407`](https://github.com/kjuulh/dagger-rs/commit/6e5f4074329ab0462445b31d4153f8497c483438)) - update to dagger v0.3.12 ([`6e5f407`](https://github.com/kjuulh/dagger-rs/commit/6e5f4074329ab0462445b31d4153f8497c483438))

View File

@@ -1,6 +1,6 @@
[package] [package]
name = "dagger-sdk" name = "dagger-sdk"
version = "0.2.2" version = "0.2.5"
edition = "2021" edition = "2021"
readme = "README.md" readme = "README.md"
license-file = "LICENSE.MIT" license-file = "LICENSE.MIT"
@@ -11,17 +11,18 @@ publish = true
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies] [dependencies]
base64 = "0.21.0"
dagger-core = { path = "../dagger-core", version = "^0.2.2" } dagger-core = { path = "../dagger-core", version = "^0.2.2" }
base64 = "0.21.0"
eyre = "0.6.8" eyre = "0.6.8"
futures = "0.3.26" futures = "0.3.26"
genco = "0.17.3"
gql_client = "1.0.7" gql_client = "1.0.7"
pretty_assertions = "1.3.0"
serde = { version = "1.0.152", features = ["derive"] } serde = { version = "1.0.152", features = ["derive"] }
serde_json = "1.0.93" serde_json = "1.0.93"
tokio = { version = "1.25.0", features = ["full"] } tokio = { version = "1.25.0", features = ["full"] }
derive_builder = "0.12.0"
[dev-dependencies] [dev-dependencies]
pretty_assertions = "1.3.0"
rand = "0.8.5" rand = "0.8.5"
genco = "0.17.3"

View File

@@ -1,4 +1,4 @@
# dagger-rs # dagger-sdk
A dagger sdk written in rust for rust. A dagger sdk written in rust for rust.
@@ -19,20 +19,20 @@ The examples match the folder name in each directory in examples
Simply install like: Simply install like:
```bash ```bash
cargo install dagger-sdk cargo add dagger-sdk
``` ```
### Usage ### Usage
```rust ```rust
fn main() -> eyre::Result<()> { fn main() -> eyre::Result<()> {
let client = dagger_sdk::client::connect()?; let client = dagger_sdk::connect()?;
let version = client let version = client
.container(None) .container(None)
.from("golang:1.19".into()) .from("golang:1.19".into())
.with_exec(vec!["go".into(), "version".into()], None) .with_exec(vec!["go".into(), "version".into()], None)
.stdout(); .stdout()?;
println!("Hello from Dagger and {}", version.trim()); println!("Hello from Dagger and {}", version.trim());

View File

@@ -1,42 +1,34 @@
use dagger_sdk::gen::HostDirectoryOpts; use dagger_sdk::HostDirectoryOpts;
fn main() -> eyre::Result<()> { fn main() -> eyre::Result<()> {
let client = dagger_sdk::client::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".into(), "examples/build-the-application/app",
Some(HostDirectoryOpts { HostDirectoryOpts {
exclude: Some(vec!["node_modules".into(), "ci/".into()]), exclude: Some(vec!["node_modules".into(), "ci/".into()]),
include: None, include: None,
}), },
); );
let source = client let source = client
.container(None) .container()
.from("node:16".into()) .from("node:16")
.with_mounted_directory("/src".into(), host_source_dir.id()); .with_mounted_directory("/src", host_source_dir.id()?);
let runner = source let runner = source
.with_workdir("/src".into()) .with_workdir("/src")
.with_exec(vec!["npm".into(), "install".into()], None); .with_exec(vec!["npm", "install"]);
let test = runner.with_exec( let test = runner.with_exec(vec!["npm", "test", "--", "--watchAll=false"]);
vec![
"npm".into(),
"test".into(),
"--".into(),
"--watchAll=false".into(),
],
None,
);
let build_dir = test let build_dir = test
.with_exec(vec!["npm".into(), "run".into(), "build".into()], None) .with_exec(vec!["npm", "run", "build"])
.directory("./build".into()); .directory("./build");
let _ = build_dir.export("./build".into()); 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

@@ -1,53 +1,40 @@
use dagger_sdk::gen::HostDirectoryOpts;
use rand::Rng; use rand::Rng;
fn main() -> eyre::Result<()> { fn main() -> eyre::Result<()> {
let client = dagger_sdk::client::connect()?; let client = dagger_sdk::connect()?;
let host_source_dir = client.host().directory( let host_source_dir = client.host().directory_opts(
"./examples/caching/app".into(), "./examples/caching/app",
Some(HostDirectoryOpts { dagger_sdk::HostDirectoryOptsBuilder::default()
exclude: Some(vec!["node_modules".into(), "ci/".into()]), .exclude(vec!["node_modules", "ci/"])
include: None, .build()?,
}),
); );
let node_cache = client.cache_volume("node".into()).id(); let node_cache = client.cache_volume("node").id()?;
let source = client let source = client
.container(None) .container()
.from("node:16".into()) .from("node:16")
.with_mounted_directory("/src".into(), host_source_dir.id()) .with_mounted_directory("/src", host_source_dir.id()?)
.with_mounted_cache("/src/node_modules".into(), node_cache, None); .with_mounted_cache("/src/node_modules", node_cache);
let runner = source let runner = source
.with_workdir("/src".into()) .with_workdir("/src")
.with_exec(vec!["npm".into(), "install".into()], None); .with_exec(vec!["npm", "install"]);
let test = runner.with_exec( let test = runner.with_exec(vec!["npm", "test", "--", "--watchAll=false"]);
vec![
"npm".into(),
"test".into(),
"--".into(),
"--watchAll=false".into(),
],
None,
);
let build_dir = test let build_dir = test
.with_exec(vec!["npm".into(), "run".into(), "build".into()], None) .with_exec(vec!["npm", "run", "build"])
.directory("./build".into()); .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".into()) .from("nginx")
.with_directory("/usr/share/nginx/html".into(), 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

@@ -1,22 +1,18 @@
use rand::Rng; use rand::Rng;
fn main() -> eyre::Result<()> { fn main() -> eyre::Result<()> {
let mut rng = rand::thread_rng(); let mut rng = rand::thread_rng();
let client = dagger_sdk::client::connect()?; let client = dagger_sdk::connect()?;
let context_dir = client let context_dir = client
.host() .host()
.directory("./examples/existing-dockerfile/app".into(), 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

@@ -1,11 +1,11 @@
fn main() -> eyre::Result<()> { fn main() -> eyre::Result<()> {
let client = dagger_sdk::client::connect()?; let client = dagger_sdk::connect()?;
let version = client let version = client
.container(None) .container()
.from("golang:1.19".into()) .from("golang:1.19")
.with_exec(vec!["go".into(), "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

@@ -1,50 +1,39 @@
use dagger_sdk::gen::HostDirectoryOpts; use dagger_sdk::HostDirectoryOpts;
use rand::Rng; use rand::Rng;
fn main() -> eyre::Result<()> { fn main() -> eyre::Result<()> {
let client = dagger_sdk::client::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".into(), "examples/publish-the-application/app",
Some(HostDirectoryOpts { HostDirectoryOpts {
exclude: Some(vec!["node_modules".into(), "ci/".into()]), exclude: Some(vec!["node_modules", "ci/"]),
include: None, include: None,
}), },
); );
let source = client let source = client
.container(None) .container()
.from("node:16".into()) .from("node:16")
.with_mounted_directory("/src".into(), host_source_dir.id()); .with_mounted_directory("/src", host_source_dir.id()?);
let runner = source let runner = source
.with_workdir("/src".into()) .with_workdir("/src")
.with_exec(vec!["npm".into(), "install".into()], None); .with_exec(vec!["npm", "install"]);
let test = runner.with_exec( let test = runner.with_exec(vec!["npm", "test", "--", "--watchAll=false"]);
vec![
"npm".into(),
"test".into(),
"--".into(),
"--watchAll=false".into(),
],
None,
);
let build_dir = test let build_dir = test
.with_exec(vec!["npm".into(), "run".into(), "build".into()], None) .with_exec(vec!["npm", "run", "build"])
.directory("./build".into()); .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".into()) .from("nginx")
.with_directory("/usr/share/nginx/html".into(), 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

@@ -1,56 +1,44 @@
use dagger_sdk::gen::HostDirectoryOpts; use dagger_sdk::HostDirectoryOpts;
use rand::Rng; use rand::Rng;
fn main() -> eyre::Result<()> { fn main() -> eyre::Result<()> {
let client = dagger_sdk::client::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".into(), "examples/publish-the-application/app",
Some(HostDirectoryOpts { HostDirectoryOpts {
exclude: Some(vec!["node_modules".into(), "ci/".into()]), exclude: Some(vec!["node_modules", "ci/"]),
include: None, include: None,
}), },
); );
let source = client let source = client
.container(None) .container()
.from("node:16".into()) .from("node:16")
.with_mounted_directory("/src".into(), host_source_dir.id()); .with_mounted_directory("/src", host_source_dir.id()?);
let runner = source let runner = source
.with_workdir("/src".into()) .with_workdir("/src")
.with_exec(vec!["npm".into(), "install".into()], None); .with_exec(vec!["npm", "install"]);
let test = runner.with_exec( let test = runner.with_exec(vec!["npm", "test", "--", "--watchAll=false"]);
vec![
"npm".into(),
"test".into(),
"--".into(),
"--watchAll=false".into(),
],
None,
);
let _ = test let _ = test
.with_exec(vec!["npm".into(), "run".into(), "build".into()], None) .with_exec(vec!["npm", "run", "build"])
.directory("./build".into()) .directory("./build")
.export(output.into()); .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".into()) .from("nginx")
.with_directory( .with_directory(
"/usr/share/nginx/html".into(), "/usr/share/nginx/html",
client.host().directory(output.into(), 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

@@ -1,36 +1,28 @@
use dagger_sdk::gen::HostDirectoryOpts; use dagger_sdk::HostDirectoryOpts;
fn main() -> eyre::Result<()> { fn main() -> eyre::Result<()> {
let client = dagger_sdk::client::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".into(), "examples/test-the-application/app",
Some(HostDirectoryOpts { HostDirectoryOpts {
exclude: Some(vec!["node_modules".into(), "ci/".into()]), exclude: Some(vec!["node_modules", "ci/"]),
include: None, include: None,
}), },
); );
let source = client let source = client
.container(None) .container()
.from("node:16".into()) .from("node:16")
.with_mounted_directory("/src".into(), host_source_dir.id()); .with_mounted_directory("/src", host_source_dir.id()?);
let runner = source let runner = source
.with_workdir("/src".into()) .with_workdir("/src")
.with_exec(vec!["npm".into(), "install".into()], None); .with_exec(vec!["npm", "install"]);
let out = runner let out = runner
.with_exec( .with_exec(vec!["npm", "test", "--", "--watchAll=false"])
vec![ .stderr()?;
"npm".into(),
"test".into(),
"--".into(),
"--watchAll=false".into(),
],
None,
)
.stderr();
println!("{}", out); println!("{}", out);

File diff suppressed because it is too large Load Diff

View File

@@ -1,18 +1,6 @@
pub mod client; mod client;
pub mod gen; mod gen;
mod querybuilder; mod querybuilder;
pub fn add(left: usize, right: usize) -> usize { pub use client::*;
left + right pub use gen::*;
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn it_works() {
let result = add(2, 2);
assert_eq!(result, 4);
}
}

View File

@@ -46,13 +46,13 @@ impl Selection {
} }
} }
pub fn arg<S>(&self, name: &str, value: S) -> eyre::Result<Selection> pub fn arg<S>(&self, name: &str, value: S) -> Selection
where where
S: Serialize, S: Serialize,
{ {
let mut s = self.clone(); let mut s = self.clone();
let val = serde_json::to_string(&value)?; let val = serde_json::to_string(&value).unwrap();
match s.args.as_mut() { match s.args.as_mut() {
Some(args) => { Some(args) => {
@@ -65,7 +65,7 @@ impl Selection {
} }
} }
Ok(s) s
} }
pub fn build(&self) -> eyre::Result<String> { pub fn build(&self) -> eyre::Result<String> {
@@ -93,7 +93,7 @@ impl Selection {
Ok(fields.join("{") + &"}".repeat(fields.len() - 1)) Ok(fields.join("{") + &"}".repeat(fields.len() - 1))
} }
pub fn execute<D>(&self, gql_client: &gql_client::Client) -> eyre::Result<Option<D>> pub fn execute<D>(&self, gql_client: &gql_client::Client) -> eyre::Result<D>
where where
D: for<'de> Deserialize<'de>, D: for<'de> Deserialize<'de>,
{ {
@@ -111,7 +111,7 @@ impl Selection {
let resp: Option<D> = self.unpack_resp(resp)?; let resp: Option<D> = self.unpack_resp(resp)?;
Ok(resp) Ok(resp.unwrap())
} }
fn path(&self) -> Vec<Selection> { fn path(&self) -> Vec<Selection> {
@@ -171,10 +171,8 @@ mod tests {
.select("core") .select("core")
.select("image") .select("image")
.arg("ref", "alpine") .arg("ref", "alpine")
.unwrap()
.select("file") .select("file")
.arg("path", "/etc/alpine-release") .arg("path", "/etc/alpine-release");
.unwrap();
let query = root.build().unwrap(); let query = root.build().unwrap();
@@ -190,10 +188,8 @@ mod tests {
.select("core") .select("core")
.select("image") .select("image")
.arg("ref", "alpine") .arg("ref", "alpine")
.unwrap()
.select_with_alias("foo", "file") .select_with_alias("foo", "file")
.arg("path", "/etc/alpine-release") .arg("path", "/etc/alpine-release");
.unwrap();
let query = root.build().unwrap(); let query = root.build().unwrap();
@@ -208,10 +204,8 @@ mod tests {
let root = query() let root = query()
.select("a") .select("a")
.arg("arg", "one") .arg("arg", "one")
.unwrap()
.select("b") .select("b")
.arg("arg", "two") .arg("arg", "two");
.unwrap();
let query = root.build().unwrap(); let query = root.build().unwrap();
@@ -222,7 +216,7 @@ mod tests {
fn test_vec_arg() { fn test_vec_arg() {
let input = vec!["some-string"]; let input = vec!["some-string"];
let root = query().select("a").arg("arg", input).unwrap(); let root = query().select("a").arg("arg", input);
let query = root.build().unwrap(); let query = root.build().unwrap();
assert_eq!(query, r#"query{a(arg:["some-string"])}"#.to_string()) assert_eq!(query, r#"query{a(arg:["some-string"])}"#.to_string())
@@ -232,7 +226,7 @@ mod tests {
fn test_ref_slice_arg() { fn test_ref_slice_arg() {
let input = &["some-string"]; let input = &["some-string"];
let root = query().select("a").arg("arg", input).unwrap(); let root = query().select("a").arg("arg", input);
let query = root.build().unwrap(); let query = root.build().unwrap();
assert_eq!(query, r#"query{a(arg:["some-string"])}"#.to_string()) assert_eq!(query, r#"query{a(arg:["some-string"])}"#.to_string())
@@ -242,7 +236,7 @@ mod tests {
fn test_stringb_arg() { fn test_stringb_arg() {
let input = "some-string".to_string(); let input = "some-string".to_string();
let root = query().select("a").arg("arg", input).unwrap(); let root = query().select("a").arg("arg", input);
let query = root.build().unwrap(); let query = root.build().unwrap();
assert_eq!(query, r#"query{a(arg:"some-string")}"#.to_string()) assert_eq!(query, r#"query{a(arg:"some-string")}"#.to_string())
@@ -275,7 +269,7 @@ mod tests {
})), })),
}; };
let root = query().select("a").arg("arg", input).unwrap(); let root = query().select("a").arg("arg", input);
let query = root.build().unwrap(); let query = root.build().unwrap();
assert_eq!( assert_eq!(

View File

@@ -1,21 +1,20 @@
use dagger_sdk::client::connect; use dagger_sdk::{connect, ContainerExecOptsBuilder};
use dagger_sdk::gen::ContainerExecOpts;
#[test] #[test]
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".into()); let alpine = client.container().from("alpine:3.16.2");
let out = alpine let out = alpine
.exec(Some(ContainerExecOpts { .exec_opts(
args: Some(vec!["cat".into(), "/etc/alpine-release".into()]), ContainerExecOptsBuilder::default()
stdin: None, .args(vec!["cat", "/etc/alpine-release"])
redirect_stdout: None, .build()
redirect_stderr: None, .unwrap(),
experimental_privileged_nesting: None, )
})) .stdout()
.stdout(); .unwrap();
assert_eq!(out, "3.16.2\n".to_string()) assert_eq!(out, "3.16.2\n".to_string())
} }

View File

@@ -4,8 +4,6 @@ pub mod cli;
mod cli_generate; mod cli_generate;
fn main() -> eyre::Result<()> { fn main() -> eyre::Result<()> {
//
color_eyre::install().unwrap(); color_eyre::install().unwrap();
let args = std::env::args(); let args = std::env::args();