Compare commits

..

No commits in common. "main" and "dagger-core-v0.2.10" have entirely different histories.

24 changed files with 329 additions and 822 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
@ -27,10 +28,5 @@ jobs:
uses: docker/setup-qemu-action@v2 uses: docker/setup-qemu-action@v2
- name: Set up Docker Buildx - name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2.0.0 uses: docker/setup-buildx-action@v2.0.0
-
name: Expose GitHub Runtime
uses: crazy-max/ghaction-github-runtime@v2
- name: Run dagger [CI] - name: Run dagger [CI]
run: | run: cargo run -p ci -- pr
export _EXPERIMENTAL_DAGGER_CACHE_CONFIG="type=gha,mode=max,url=$ACTIONS_CACHE_URL,token=$ACTIONS_RUNTIME_TOKEN"
cargo run -p ci -- pr

404
Cargo.lock generated
View File

@ -17,55 +17,6 @@ version = "1.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe"
[[package]]
name = "anstream"
version = "0.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6342bd4f5a1205d7f41e94a41a901f5647c938cdfa96036338e8533c9d6c2450"
dependencies = [
"anstyle",
"anstyle-parse",
"anstyle-query",
"anstyle-wincon",
"colorchoice",
"is-terminal",
"utf8parse",
]
[[package]]
name = "anstyle"
version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "41ed9a86bf92ae6580e0a31281f65a1b1d867c0cc68d5346e2ae128dddfa6a7d"
[[package]]
name = "anstyle-parse"
version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e765fd216e48e067936442276d1d57399e37bce53c264d6fefbe298080cb57ee"
dependencies = [
"utf8parse",
]
[[package]]
name = "anstyle-query"
version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5ca11d4be1bab0c8bc8734a9aa7bf4ee8316d462a08c6ac5052f888fef5b494b"
dependencies = [
"windows-sys 0.48.0",
]
[[package]]
name = "anstyle-wincon"
version = "1.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "180abfa45703aebe0093f79badacc01b8fd4ea2e35118747e5811127f926e188"
dependencies = [
"anstyle",
"windows-sys 0.48.0",
]
[[package]] [[package]]
name = "ascii" name = "ascii"
version = "0.9.3" version = "0.9.3"
@ -74,13 +25,13 @@ checksum = "eab1c04a571841102f5345a8fc0f6bb3d31c315dec879b5c6e42e40ce7ffa34e"
[[package]] [[package]]
name = "async-trait" name = "async-trait"
version = "0.1.68" version = "0.1.67"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b9ccdd8f2a161be9bd5c023df56f1b2a0bd1d83872ae53b71a84a12c9bf6e842" checksum = "86ea188f25f0255d8f92797797c97ebf5631fa88178beb1a46fdf5622c9a00e4"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.15", "syn 2.0.11",
] ]
[[package]] [[package]]
@ -116,6 +67,12 @@ version = "1.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
[[package]]
name = "bitflags"
version = "2.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d5dd14596c0e5b954530d0e6f1fd99b89c03e313aa2086e8da4303701a09e1cf"
[[package]] [[package]]
name = "block-buffer" name = "block-buffer"
version = "0.10.4" version = "0.10.4"
@ -127,9 +84,9 @@ dependencies = [
[[package]] [[package]]
name = "bumpalo" name = "bumpalo"
version = "3.12.1" version = "3.12.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9b1ce199063694f33ffb7dd4e0ee620741495c32833cde5aa08f02a0bf96f0c8" checksum = "0d261e256854913907f67ed06efbc3338dfe6179796deefc1ff763fc1aee5535"
[[package]] [[package]]
name = "byteorder" name = "byteorder"
@ -168,31 +125,25 @@ dependencies = [
[[package]] [[package]]
name = "clap" name = "clap"
version = "4.2.4" version = "4.1.11"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "956ac1f6381d8d82ab4684768f89c0ea3afe66925ceadb4eeb3fc452ffc55d62" checksum = "42dfd32784433290c51d92c438bb72ea5063797fc3cc9a21a8c4346bebbb2098"
dependencies = [ dependencies = [
"clap_builder", "bitflags 2.0.1",
]
[[package]]
name = "clap_builder"
version = "4.2.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "84080e799e54cff944f4b4a4b0e71630b0e0443b25b985175c7dddc1a859b749"
dependencies = [
"anstream",
"anstyle",
"bitflags",
"clap_lex", "clap_lex",
"is-terminal",
"strsim", "strsim",
"termcolor",
] ]
[[package]] [[package]]
name = "clap_lex" name = "clap_lex"
version = "0.4.1" version = "0.3.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8a2dd5a6fe8c6e3502f568a6353e5273bbb15193ad9a89e457b9970798efbea1" checksum = "033f6b7a4acb1f358c742aaca805c939ee73b4c6209ae4318ec7aca81c42e646"
dependencies = [
"os_str_bytes",
]
[[package]] [[package]]
name = "color-eyre" name = "color-eyre"
@ -221,12 +172,6 @@ dependencies = [
"tracing-error", "tracing-error",
] ]
[[package]]
name = "colorchoice"
version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7"
[[package]] [[package]]
name = "combine" name = "combine"
version = "3.8.1" version = "3.8.1"
@ -251,9 +196,9 @@ dependencies = [
[[package]] [[package]]
name = "cpufeatures" name = "cpufeatures"
version = "0.2.7" version = "0.2.5"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3e4c1eaa2012c47becbbad2ab175484c2a84d1185b566fb2cc5b8707343dfe58" checksum = "28d997bd5e24a5928dd43e46dc529867e207907fe0b239c3477d924f7f2ca320"
dependencies = [ dependencies = [
"libc", "libc",
] ]
@ -317,7 +262,7 @@ dependencies = [
[[package]] [[package]]
name = "dagger-core" name = "dagger-core"
version = "0.2.11" version = "0.2.10"
dependencies = [ dependencies = [
"async-trait", "async-trait",
"base64", "base64",
@ -334,7 +279,6 @@ dependencies = [
"sha2", "sha2",
"tar", "tar",
"tempfile", "tempfile",
"thiserror",
"tokio", "tokio",
"tracing", "tracing",
"tracing-subscriber", "tracing-subscriber",
@ -342,7 +286,7 @@ dependencies = [
[[package]] [[package]]
name = "dagger-sdk" name = "dagger-sdk"
version = "0.2.22" version = "0.2.20"
dependencies = [ dependencies = [
"dagger-core", "dagger-core",
"derive_builder", "derive_builder",
@ -353,7 +297,6 @@ dependencies = [
"rand", "rand",
"serde", "serde",
"serde_json", "serde_json",
"thiserror",
"tokio", "tokio",
"tracing", "tracing",
"tracing-subscriber", "tracing-subscriber",
@ -479,13 +422,13 @@ dependencies = [
[[package]] [[package]]
name = "errno" name = "errno"
version = "0.3.1" version = "0.2.8"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4bcfec3a70f97c962c307b2d2c56e358cf1d00b558d74262b5f929ee8cc7e73a" checksum = "f639046355ee4f37944e44f60642c6f3a7efa3cf6b78c78a0d989a8ce6c396a1"
dependencies = [ dependencies = [
"errno-dragonfly", "errno-dragonfly",
"libc", "libc",
"windows-sys 0.48.0", "winapi",
] ]
[[package]] [[package]]
@ -519,14 +462,14 @@ dependencies = [
[[package]] [[package]]
name = "filetime" name = "filetime"
version = "0.2.21" version = "0.2.20"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5cbc844cecaee9d4443931972e1289c8ff485cb4cc2767cb03ca139ed6885153" checksum = "8a3de6e8d11b22ff9edc6d916f890800597d60f8b2da1caf2955c274638d6412"
dependencies = [ dependencies = [
"cfg-if", "cfg-if",
"libc", "libc",
"redox_syscall 0.2.16", "redox_syscall",
"windows-sys 0.48.0", "windows-sys 0.45.0",
] ]
[[package]] [[package]]
@ -610,7 +553,7 @@ checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.15", "syn 2.0.11",
] ]
[[package]] [[package]]
@ -645,9 +588,9 @@ dependencies = [
[[package]] [[package]]
name = "genco" name = "genco"
version = "0.17.5" version = "0.17.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6973ce8518068a71d404f428f6a5b563088545546a6bd8f9c0a7f2608149bc8a" checksum = "43de41c8ce1ed5ac84a1b11fb3e4ef604bf6773068798490eaa95e8151abad20"
dependencies = [ dependencies = [
"genco-macros", "genco-macros",
"relative-path", "relative-path",
@ -656,9 +599,9 @@ dependencies = [
[[package]] [[package]]
name = "genco-macros" name = "genco-macros"
version = "0.17.5" version = "0.17.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9c2c778cf01917d0fbed53900259d6604a421fab4916a2e738856ead9f1d926a" checksum = "c85fd34848b1f708e6344a4af6f7bfc05172ae20ce4b35c8e417efffb4f306aa"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
@ -667,9 +610,9 @@ dependencies = [
[[package]] [[package]]
name = "generic-array" name = "generic-array"
version = "0.14.7" version = "0.14.6"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" checksum = "bff49e947297f3312447abdca79f45f4738097cc82b06e72054d2223f601f1b9"
dependencies = [ dependencies = [
"typenum", "typenum",
"version_check", "version_check",
@ -677,9 +620,9 @@ dependencies = [
[[package]] [[package]]
name = "getrandom" name = "getrandom"
version = "0.2.9" version = "0.2.8"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c85e1d9ab2eadba7e5040d4e09cbd6d072b76a557ad64e797c2cb9d4da21d7e4" checksum = "c05aeb6a22b8f62540c194aac980f2115af067bfe15a0734d7277a768d396b31"
dependencies = [ dependencies = [
"cfg-if", "cfg-if",
"libc", "libc",
@ -753,9 +696,9 @@ dependencies = [
[[package]] [[package]]
name = "h2" name = "h2"
version = "0.3.18" version = "0.3.16"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "17f8a914c2987b688368b5138aa05321db91f4090cf26118185672ad588bce21" checksum = "5be7b54589b581f624f566bf5d8eb2bab1db736c51528720b6bd36b96b55924d"
dependencies = [ dependencies = [
"bytes", "bytes",
"fnv", "fnv",
@ -845,9 +788,9 @@ checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421"
[[package]] [[package]]
name = "hyper" name = "hyper"
version = "0.14.26" version = "0.14.25"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ab302d72a6f11a3b910431ff93aae7e773078c769f0a3ef15fb9ec692ed147d4" checksum = "cc5e554ff619822309ffd57d8734d77cd5ce6238bc956f037ea06c58238c9899"
dependencies = [ dependencies = [
"bytes", "bytes",
"futures-channel", "futures-channel",
@ -904,9 +847,9 @@ checksum = "ce23b50ad8242c51a442f3ff322d56b02f08852c77e4c0b4d3fd684abc89c683"
[[package]] [[package]]
name = "indexmap" name = "indexmap"
version = "1.9.3" version = "1.9.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" checksum = "1885e79c1fc4b10f0e172c475f458b7f7b93061064d98c3293e98c5ba0c8b399"
dependencies = [ dependencies = [
"autocfg", "autocfg",
"hashbrown", "hashbrown",
@ -923,31 +866,31 @@ dependencies = [
[[package]] [[package]]
name = "io-lifetimes" name = "io-lifetimes"
version = "1.0.10" version = "1.0.8"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9c66c74d2ae7e79a5a8f7ac924adbe38ee42a859c6539ad869eb51f0b52dc220" checksum = "0dd6da19f25979c7270e70fa95ab371ec3b701cd0eefc47667a09785b3c59155"
dependencies = [ dependencies = [
"hermit-abi 0.3.1", "hermit-abi 0.3.1",
"libc", "libc",
"windows-sys 0.48.0", "windows-sys 0.45.0",
] ]
[[package]] [[package]]
name = "ipnet" name = "ipnet"
version = "2.7.2" version = "2.7.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "12b6ee2129af8d4fb011108c73d99a1b83a85977f23b82460c0ae2e25bb4b57f" checksum = "30e22bd8629359895450b59ea7a776c850561b96a3b1d31321c1949d9e6c9146"
[[package]] [[package]]
name = "is-terminal" name = "is-terminal"
version = "0.4.7" version = "0.4.5"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "adcf93614601c8129ddf72e2d5633df827ba6551541c6d8c59520a371475be1f" checksum = "8687c819457e979cc940d09cb16e42a1bf70aa6b60a549de6d3a62a0ee90c69e"
dependencies = [ dependencies = [
"hermit-abi 0.3.1", "hermit-abi 0.3.1",
"io-lifetimes", "io-lifetimes",
"rustix", "rustix",
"windows-sys 0.48.0", "windows-sys 0.45.0",
] ]
[[package]] [[package]]
@ -982,15 +925,15 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
[[package]] [[package]]
name = "libc" name = "libc"
version = "0.2.142" version = "0.2.140"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6a987beff54b60ffa6d51982e1aa1146bc42f19bd26be28b0586f252fccf5317" checksum = "99227334921fae1a979cf0bfdfcc6b3e5ce376ef57e16fb6fb3ea2ed6095f80c"
[[package]] [[package]]
name = "linux-raw-sys" name = "linux-raw-sys"
version = "0.3.4" version = "0.1.4"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "36eb31c1778188ae1e64398743890d0877fef36d11521ac60406b42016e8c2cf" checksum = "f051f77a7c8e6957c0696eac88f26b0117e54f52d3fc682ab19397a8812846a4"
[[package]] [[package]]
name = "lock_api" name = "lock_api"
@ -1028,9 +971,9 @@ checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d"
[[package]] [[package]]
name = "mime" name = "mime"
version = "0.3.17" version = "0.3.16"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" checksum = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d"
[[package]] [[package]]
name = "miniz_oxide" name = "miniz_oxide"
@ -1088,6 +1031,12 @@ version = "1.17.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b7e5500299e16ebb147ae15a00a942af264cf3688f47923b8fc2cd5858f23ad3" checksum = "b7e5500299e16ebb147ae15a00a942af264cf3688f47923b8fc2cd5858f23ad3"
[[package]]
name = "os_str_bytes"
version = "6.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9b7820b9daea5457c9f21c69448905d723fbd21136ccf521748f23fd49e723ee"
[[package]] [[package]]
name = "output_vt100" name = "output_vt100"
version = "0.1.3" version = "0.1.3"
@ -1127,7 +1076,7 @@ checksum = "9069cbb9f99e3a5083476ccb29ceb1de18b9118cafa53e90c9551235de2b9521"
dependencies = [ dependencies = [
"cfg-if", "cfg-if",
"libc", "libc",
"redox_syscall 0.2.16", "redox_syscall",
"smallvec", "smallvec",
"windows-sys 0.45.0", "windows-sys 0.45.0",
] ]
@ -1180,9 +1129,9 @@ dependencies = [
[[package]] [[package]]
name = "proc-macro2" name = "proc-macro2"
version = "1.0.56" version = "1.0.52"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2b63bdb0cd06f1f4dedf69b254734f9b45af66e4a031e42a7480257d9898b435" checksum = "1d0e1ae9e836cc3beddd63db0df682593d7e2d3d891ae8c9083d2113e1744224"
dependencies = [ dependencies = [
"unicode-ident", "unicode-ident",
] ]
@ -1232,16 +1181,7 @@ version = "0.2.16"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a"
dependencies = [ dependencies = [
"bitflags", "bitflags 1.3.2",
]
[[package]]
name = "redox_syscall"
version = "0.3.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29"
dependencies = [
"bitflags",
] ]
[[package]] [[package]]
@ -1251,17 +1191,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b" checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b"
dependencies = [ dependencies = [
"getrandom", "getrandom",
"redox_syscall 0.2.16", "redox_syscall",
"thiserror", "thiserror",
] ]
[[package]] [[package]]
name = "regex" name = "regex"
version = "1.8.1" version = "1.7.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "af83e617f331cc6ae2da5443c602dfa5af81e517212d9d611a5b3ba1777b5370" checksum = "48aaa5748ba571fb95cd2c85c09f629215d3a6ece942baa100950af03a34f733"
dependencies = [ dependencies = [
"regex-syntax 0.7.1", "regex-syntax",
] ]
[[package]] [[package]]
@ -1270,20 +1210,14 @@ version = "0.1.10"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132"
dependencies = [ dependencies = [
"regex-syntax 0.6.29", "regex-syntax",
] ]
[[package]] [[package]]
name = "regex-syntax" name = "regex-syntax"
version = "0.6.29" version = "0.6.28"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" checksum = "456c603be3e8d448b072f410900c09faf164fbce2d480456f50eea6e25f9c848"
[[package]]
name = "regex-syntax"
version = "0.7.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a5996294f19bd3aae0453a862ad728f60e6600695733dd5df01da90c54363a3c"
[[package]] [[package]]
name = "relative-path" name = "relative-path"
@ -1293,9 +1227,9 @@ checksum = "4bf2521270932c3c7bed1a59151222bd7643c79310f2916f01925e1e16255698"
[[package]] [[package]]
name = "reqwest" name = "reqwest"
version = "0.11.16" version = "0.11.14"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "27b71749df584b7f4cac2c426c127a7c785a5106cc98f7a8feb044115f0fa254" checksum = "21eed90ec8570952d53b772ecf8f206aa1ec9a3d76b2521c56c42973f2d91ee9"
dependencies = [ dependencies = [
"base64", "base64",
"bytes", "bytes",
@ -1349,22 +1283,22 @@ dependencies = [
[[package]] [[package]]
name = "rustc-demangle" name = "rustc-demangle"
version = "0.1.23" version = "0.1.21"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" checksum = "7ef03e0a2b150c7a90d01faf6254c9c48a41e95fb2a8c2ac1c6f0d2b9aefc342"
[[package]] [[package]]
name = "rustix" name = "rustix"
version = "0.37.14" version = "0.36.10"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d9b864d3c18a5785a05953adeed93e2dca37ed30f18e69bba9f30079d51f363f" checksum = "2fe885c3a125aa45213b68cc1472a49880cb5923dc23f522ad2791b882228778"
dependencies = [ dependencies = [
"bitflags", "bitflags 1.3.2",
"errno", "errno",
"io-lifetimes", "io-lifetimes",
"libc", "libc",
"linux-raw-sys", "linux-raw-sys",
"windows-sys 0.48.0", "windows-sys 0.45.0",
] ]
[[package]] [[package]]
@ -1412,29 +1346,29 @@ dependencies = [
[[package]] [[package]]
name = "serde" name = "serde"
version = "1.0.160" version = "1.0.157"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bb2f3770c8bce3bcda7e149193a069a0f4365bda1fa5cd88e03bca26afc1216c" checksum = "707de5fcf5df2b5788fca98dd7eab490bc2fd9b7ef1404defc462833b83f25ca"
dependencies = [ dependencies = [
"serde_derive", "serde_derive",
] ]
[[package]] [[package]]
name = "serde_derive" name = "serde_derive"
version = "1.0.160" version = "1.0.157"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "291a097c63d8497e00160b166a967a4a79c64f3facdd01cbd7502231688d77df" checksum = "78997f4555c22a7971214540c4a661291970619afd56de19f77e0de86296e1e5"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.15", "syn 2.0.11",
] ]
[[package]] [[package]]
name = "serde_json" name = "serde_json"
version = "1.0.96" version = "1.0.94"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "057d394a50403bcac12672b2b18fb387ab6d289d957dab67dd201875391e52f1" checksum = "1c533a59c9d8a93a09c6ab31f0fd5e5f4dd1b8fc9434804029839884765d04ea"
dependencies = [ dependencies = [
"itoa", "itoa",
"ryu", "ryu",
@ -1532,9 +1466,9 @@ dependencies = [
[[package]] [[package]]
name = "syn" name = "syn"
version = "2.0.15" version = "2.0.11"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a34fcf3e8b60f57e6a14301a2e916d323af98b0ea63c599441eec8558660c822" checksum = "21e3787bb71465627110e7d87ed4faaa36c1f61042ee67badb9e2ef173accc40"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
@ -1554,15 +1488,24 @@ dependencies = [
[[package]] [[package]]
name = "tempfile" name = "tempfile"
version = "3.5.0" version = "3.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b9fbec84f381d5795b08656e4912bec604d162bff9291d6189a78f4c8ab87998" checksum = "af18f7ae1acd354b992402e9ec5864359d693cd8a79dcbef59f76891701c1e95"
dependencies = [ dependencies = [
"cfg-if", "cfg-if",
"fastrand", "fastrand",
"redox_syscall 0.3.5", "redox_syscall",
"rustix", "rustix",
"windows-sys 0.45.0", "windows-sys 0.42.0",
]
[[package]]
name = "termcolor"
version = "1.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "be55cf8942feac5c765c2c993422806843c9a9a45d4d5c407ad6dd2ea95eb9b6"
dependencies = [
"winapi-util",
] ]
[[package]] [[package]]
@ -1582,7 +1525,7 @@ checksum = "f9456a42c5b0d803c8cd86e73dd7cc9edd429499f37a3550d286d5e86720569f"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.15", "syn 2.0.11",
] ]
[[package]] [[package]]
@ -1612,13 +1555,14 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20"
[[package]] [[package]]
name = "tokio" name = "tokio"
version = "1.27.0" version = "1.26.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d0de47a4eecbe11f498978a9b29d792f0d2692d1dd003650c24c76510e3bc001" checksum = "03201d01c3c27a29c8a5cee5b55a93ddae1ccf6f08f65365c2c918f8c1b76f64"
dependencies = [ dependencies = [
"autocfg", "autocfg",
"bytes", "bytes",
"libc", "libc",
"memchr",
"mio", "mio",
"num_cpus", "num_cpus",
"parking_lot", "parking_lot",
@ -1631,13 +1575,13 @@ dependencies = [
[[package]] [[package]]
name = "tokio-macros" name = "tokio-macros"
version = "2.0.0" version = "1.8.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "61a573bdc87985e9d6ddeed1b3d864e8a302c847e40d647746df2f1de209d1ce" checksum = "d266c00fde287f55d3f1c3e96c500c362a2b8c695076ec180f27918820bc6df8"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.15", "syn 1.0.109",
] ]
[[package]] [[package]]
@ -1686,13 +1630,13 @@ dependencies = [
[[package]] [[package]]
name = "tracing-attributes" name = "tracing-attributes"
version = "0.1.24" version = "0.1.23"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0f57e3ca2a01450b1a921183a9c9cbfda207fd822cef4ccb00a65402cbba7a74" checksum = "4017f8f45139870ca7e672686113917c71c7a6e02d4924eda67186083c03081a"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.15", "syn 1.0.109",
] ]
[[package]] [[package]]
@ -1728,9 +1672,9 @@ dependencies = [
[[package]] [[package]]
name = "tracing-subscriber" name = "tracing-subscriber"
version = "0.3.17" version = "0.3.16"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "30a651bc37f915e81f087d86e62a18eec5f79550c7faff886f7090b4ea757c77" checksum = "a6176eae26dd70d0c919749377897b54a9276bd7061339665dd68777926b5a70"
dependencies = [ dependencies = [
"matchers", "matchers",
"nu-ansi-term", "nu-ansi-term",
@ -1781,9 +1725,9 @@ checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba"
[[package]] [[package]]
name = "unicode-bidi" name = "unicode-bidi"
version = "0.3.13" version = "0.3.12"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460" checksum = "7d502c968c6a838ead8e69b2ee18ec708802f99db92a0d156705ec9ef801993b"
[[package]] [[package]]
name = "unicode-ident" name = "unicode-ident"
@ -1832,12 +1776,6 @@ dependencies = [
"percent-encoding", "percent-encoding",
] ]
[[package]]
name = "utf8parse"
version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a"
[[package]] [[package]]
name = "valuable" name = "valuable"
version = "0.1.0" version = "0.1.0"
@ -1996,6 +1934,15 @@ version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
[[package]]
name = "winapi-util"
version = "0.1.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178"
dependencies = [
"winapi",
]
[[package]] [[package]]
name = "winapi-x86_64-pc-windows-gnu" name = "winapi-x86_64-pc-windows-gnu"
version = "0.4.0" version = "0.4.0"
@ -2004,20 +1951,26 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
[[package]] [[package]]
name = "windows-sys" name = "windows-sys"
version = "0.45.0" version = "0.42.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7"
dependencies = [ dependencies = [
"windows-targets 0.42.2", "windows_aarch64_gnullvm",
"windows_aarch64_msvc",
"windows_i686_gnu",
"windows_i686_msvc",
"windows_x86_64_gnu",
"windows_x86_64_gnullvm",
"windows_x86_64_msvc",
] ]
[[package]] [[package]]
name = "windows-sys" name = "windows-sys"
version = "0.48.0" version = "0.45.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0"
dependencies = [ dependencies = [
"windows-targets 0.48.0", "windows-targets",
] ]
[[package]] [[package]]
@ -2026,28 +1979,13 @@ version = "0.42.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071"
dependencies = [ dependencies = [
"windows_aarch64_gnullvm 0.42.2", "windows_aarch64_gnullvm",
"windows_aarch64_msvc 0.42.2", "windows_aarch64_msvc",
"windows_i686_gnu 0.42.2", "windows_i686_gnu",
"windows_i686_msvc 0.42.2", "windows_i686_msvc",
"windows_x86_64_gnu 0.42.2", "windows_x86_64_gnu",
"windows_x86_64_gnullvm 0.42.2", "windows_x86_64_gnullvm",
"windows_x86_64_msvc 0.42.2", "windows_x86_64_msvc",
]
[[package]]
name = "windows-targets"
version = "0.48.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7b1eb6f0cd7c80c79759c929114ef071b87354ce476d9d94271031c0497adfd5"
dependencies = [
"windows_aarch64_gnullvm 0.48.0",
"windows_aarch64_msvc 0.48.0",
"windows_i686_gnu 0.48.0",
"windows_i686_msvc 0.48.0",
"windows_x86_64_gnu 0.48.0",
"windows_x86_64_gnullvm 0.48.0",
"windows_x86_64_msvc 0.48.0",
] ]
[[package]] [[package]]
@ -2056,84 +1994,42 @@ version = "0.42.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8"
[[package]]
name = "windows_aarch64_gnullvm"
version = "0.48.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc"
[[package]] [[package]]
name = "windows_aarch64_msvc" name = "windows_aarch64_msvc"
version = "0.42.2" version = "0.42.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43"
[[package]]
name = "windows_aarch64_msvc"
version = "0.48.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3"
[[package]] [[package]]
name = "windows_i686_gnu" name = "windows_i686_gnu"
version = "0.42.2" version = "0.42.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f"
[[package]]
name = "windows_i686_gnu"
version = "0.48.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241"
[[package]] [[package]]
name = "windows_i686_msvc" name = "windows_i686_msvc"
version = "0.42.2" version = "0.42.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060"
[[package]]
name = "windows_i686_msvc"
version = "0.48.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00"
[[package]] [[package]]
name = "windows_x86_64_gnu" name = "windows_x86_64_gnu"
version = "0.42.2" version = "0.42.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36"
[[package]]
name = "windows_x86_64_gnu"
version = "0.48.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1"
[[package]] [[package]]
name = "windows_x86_64_gnullvm" name = "windows_x86_64_gnullvm"
version = "0.42.2" version = "0.42.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3"
[[package]]
name = "windows_x86_64_gnullvm"
version = "0.48.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953"
[[package]] [[package]]
name = "windows_x86_64_msvc" name = "windows_x86_64_msvc"
version = "0.42.2" version = "0.42.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0"
[[package]]
name = "windows_x86_64_msvc"
version = "0.48.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a"
[[package]] [[package]]
name = "winreg" name = "winreg"
version = "0.10.1" version = "0.10.1"

View File

@ -9,7 +9,7 @@ members = [
[workspace.dependencies] [workspace.dependencies]
dagger-codegen = { path = "crates/dagger-codegen", version = "^0.2.5" } dagger-codegen = { path = "crates/dagger-codegen", version = "^0.2.5" }
dagger-core = { path = "crates/dagger-core", version = "^0.2.10" } dagger-core = { path = "crates/dagger-core", version = "^0.2.8" }
dagger-bootstrap = { path = "crates/dagger-bootstrap", version = "^0.2.10" } dagger-bootstrap = { path = "crates/dagger-bootstrap", version = "^0.2.10" }
dagger-sdk = { path = "crates/dagger-sdk", version = "^0.2.19" } dagger-sdk = { path = "crates/dagger-sdk", version = "^0.2.19" }
@ -23,4 +23,3 @@ tracing-subscriber = { version = "0.3.16", features = [
"tracing-log", "tracing-log",
"tracing", "tracing",
] } ] }
thiserror = "1.0.40"

View File

@ -1,7 +1,69 @@
# dagger-sdk # dagger-sdk
A dagger sdk written in rust A dagger sdk written in rust for rust.
## Disclaimer: ## Plan for next release
Repository has moved to: https://github.com/dagger/dagger/tree/main/sdk/rust - [ ] Introduce [thiserror](https://docs.rs/thiserror/latest/thiserror/) for
better errors
- [ ] Add compatibility with `dagger run`
- [ ] Add open telemetry tracing to the sdk
- [ ] Remove `id().await?` from passing to other dagger graphs, this should make
the design much cleaner
- [ ] Start MkBook on how to actually use the sdk
- [ ] Update to newest upstream release
- [ ] Fix bugs
- [x] Run in conjunction with golang and other sdks
- [ ] Stabilize the initial `Arc<Query>` model into something more extensible
## Examples
See [examples](./crates/dagger-sdk/examples/)
Run them like so
```bash
cargo run --example first-pipeline
```
The examples match the folder name in each directory in examples
## Install
Simply install like:
```bash
cargo add dagger-sdk
```
### Usage
```rust
#[tokio::main]
async fn main() -> eyre::Result<()> {
let client = dagger_sdk::connect().await?;
let version = client
.container()
.from("golang:1.19")
.with_exec(vec!["go", "version"])
.stdout()
.await?;
println!("Hello from Dagger and {}", version.trim());
Ok(())
}
```
And run it like a normal application:
```bash
cargo run
```
### Contributing
See [CONTRIBUTING](./CONTRIBUTING.md)
or just cargo make codegen

View File

@ -8,6 +8,6 @@ edition = "2021"
[dependencies] [dependencies]
clap = "4.1.6" clap = "4.1.6"
color-eyre = "0.6.2" color-eyre = "0.6.2"
dagger-sdk = { path = "../crates/dagger-sdk/", version = "^0.2.22" } dagger-sdk = { path = "../crates/dagger-sdk/", version = "^0.2.20" }
eyre = "0.6.8" eyre = "0.6.8"
tokio = { version = "1.25.0", features = ["full"] } tokio = { version = "1.25.0", features = ["full"] }

View File

@ -13,7 +13,7 @@ use self::generator::DynGenerator;
fn set_schema_parents(mut schema: Schema) -> Schema { fn set_schema_parents(mut schema: Schema) -> Schema {
for t in schema.types.as_mut().into_iter().flatten().flatten() { for t in schema.types.as_mut().into_iter().flatten().flatten() {
let t_parent = t.full_type.clone(); let t_parent = t.full_type.clone();
for field in t.full_type.fields.as_mut().into_iter().flatten() { for mut field in t.full_type.fields.as_mut().into_iter().flatten() {
field.parent_type = Some(t_parent.clone()); field.parent_type = Some(t_parent.clone());
} }
} }

View File

@ -235,10 +235,8 @@ fn render_output_type(funcs: &CommonFunctions, type_ref: &TypeRef) -> rust::Toke
}; };
} }
let dagger_error = rust::import("crate::errors", "DaggerError");
quote! { quote! {
Result<$output_type, $dagger_error> eyre::Result<$output_type>
} }
} }

View File

@ -18,7 +18,7 @@ pub fn render_object(funcs: &CommonFunctions, t: &FullType) -> eyre::Result<rust
Ok(quote! { Ok(quote! {
#[derive(Clone)] #[derive(Clone)]
pub struct $(t.name.pipe(|s| format_name(s))) { pub struct $(t.name.pipe(|s| format_name(s))) {
pub proc: Option<$arc<$child>>, pub proc: $arc<$child>,
pub selection: $selection, pub selection: $selection,
pub graphql_client: $graphql_client pub graphql_client: $graphql_client
} }

View File

@ -5,33 +5,6 @@ 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.11 (2023-04-29)
### New Features
- <csr-id-2a29a66217fa4d6c530ea1ce670c8836383e7051/> dagger-run support
- <csr-id-eb7470c604169d1a15976078c0889d5cc7011257/> update to dagger-5.1
### Commit Statistics
<csr-read-only-do-not-edit/>
- 2 commits contributed to the release.
- 4 days passed between releases.
- 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**
- dagger-run support ([`2a29a66`](https://github.com/kjuulh/dagger-sdk/commit/2a29a66217fa4d6c530ea1ce670c8836383e7051))
- update to dagger-5.1 ([`eb7470c`](https://github.com/kjuulh/dagger-sdk/commit/eb7470c604169d1a15976078c0889d5cc7011257))
</details>
## v0.2.10 (2023-04-25) ## v0.2.10 (2023-04-25)
### Bug Fixes ### Bug Fixes
@ -42,7 +15,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/>
- 2 commits contributed to the release. - 1 commit contributed to the release.
- 21 days passed between releases. - 21 days passed between releases.
- 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
@ -54,7 +27,6 @@ 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.10 ([`8011c42`](https://github.com/kjuulh/dagger-sdk/commit/8011c42dc077d101b1bccaf231fac17636dd249d))
- delete other files/folder in downloads: #57 ([`9d3c21d`](https://github.com/kjuulh/dagger-sdk/commit/9d3c21d16b4a64eb7a7b1888365a4c4ea56d7225)) - delete other files/folder in downloads: #57 ([`9d3c21d`](https://github.com/kjuulh/dagger-sdk/commit/9d3c21d16b4a64eb7a7b1888365a4c4ea56d7225))
</details> </details>

View File

@ -1,6 +1,6 @@
[package] [package]
name = "dagger-core" name = "dagger-core"
version = "0.2.11" version = "0.2.10"
edition = "2021" edition = "2021"
readme = "README.md" readme = "README.md"
license-file = "LICENSE.MIT" license-file = "LICENSE.MIT"
@ -16,7 +16,6 @@ serde_json = { workspace = true }
tokio = { workspace = true } tokio = { workspace = true }
tracing = { workspace = true } tracing = { workspace = true }
tracing-subscriber = { workspace = true } tracing-subscriber = { workspace = true }
thiserror.workspace = true
base64 = "0.21.0" base64 = "0.21.0"
dirs = "4.0.0" dirs = "4.0.0"

View File

@ -89,7 +89,6 @@ impl InnerCliSession {
while let Ok(Some(line)) = stdout_bufr.next_line().await { while let Ok(Some(line)) = stdout_bufr.next_line().await {
if let Ok(conn) = serde_json::from_str::<ConnectParams>(&line) { if let Ok(conn) = serde_json::from_str::<ConnectParams>(&line) {
sender.send(conn).await.unwrap(); sender.send(conn).await.unwrap();
continue;
} }
if let Some(logger) = &logger { if let Some(logger) = &logger {

View File

@ -23,25 +23,10 @@ impl Engine {
pub async fn start( pub async fn start(
&self, &self,
cfg: &Config, cfg: &Config,
) -> eyre::Result<(ConnectParams, Option<tokio::process::Child>)> { ) -> eyre::Result<(ConnectParams, tokio::process::Child)> {
tracing::info!("starting dagger-engine"); tracing::info!("starting dagger-engine");
if let Ok(conn) = self.from_session_env().await { // TODO: Add from existing session as well
return Ok((conn, None)); self.from_cli(cfg).await
}
let (conn, proc) = self.from_cli(cfg).await?;
Ok((conn, Some(proc)))
}
async fn from_session_env(&self) -> eyre::Result<ConnectParams> {
let port = std::env::var("DAGGER_SESSION_PORT").map(|p| p.parse::<u64>())??;
let token = std::env::var("DAGGER_SESSION_TOKEN")?;
Ok(ConnectParams {
port,
session_token: token,
})
} }
} }

View File

@ -15,7 +15,7 @@ pub struct GraphQLError {
#[derive(Deserialize, Debug, Clone)] #[derive(Deserialize, Debug, Clone)]
#[allow(dead_code)] #[allow(dead_code)]
pub struct GraphQLErrorMessage { pub struct GraphQLErrorMessage {
pub message: String, message: String,
locations: Option<Vec<GraphQLErrorLocation>>, locations: Option<Vec<GraphQLErrorLocation>>,
extensions: Option<HashMap<String, String>>, extensions: Option<HashMap<String, String>>,
path: Option<Vec<GraphQLErrorPathParam>>, path: Option<Vec<GraphQLErrorPathParam>>,

View File

@ -4,14 +4,13 @@ use std::sync::Arc;
use async_trait::async_trait; use async_trait::async_trait;
use base64::engine::general_purpose; use base64::engine::general_purpose;
use base64::Engine; use base64::Engine;
use thiserror::Error;
use crate::connect_params::ConnectParams; use crate::connect_params::ConnectParams;
use crate::gql_client::{ClientConfig, GQLClient}; use crate::gql_client::{ClientConfig, GQLClient};
#[async_trait] #[async_trait]
pub trait GraphQLClient { pub trait GraphQLClient {
async fn query(&self, query: &str) -> Result<Option<serde_json::Value>, GraphQLError>; async fn query(&self, query: &str) -> eyre::Result<Option<serde_json::Value>>;
} }
pub type DynGraphQLClient = Arc<dyn GraphQLClient + Send + Sync>; pub type DynGraphQLClient = Arc<dyn GraphQLClient + Send + Sync>;
@ -41,50 +40,13 @@ impl DefaultGraphQLClient {
#[async_trait] #[async_trait]
impl GraphQLClient for DefaultGraphQLClient { impl GraphQLClient for DefaultGraphQLClient {
async fn query(&self, query: &str) -> Result<Option<serde_json::Value>, GraphQLError> { async fn query(&self, query: &str) -> eyre::Result<Option<serde_json::Value>> {
let res: Option<serde_json::Value> = let res: Option<serde_json::Value> = self
self.client.query(&query).await.map_err(map_graphql_error)?; .client
.query(&query)
.await
.map_err(|r| eyre::anyhow!(r.to_string()))?;
return Ok(res); return Ok(res);
} }
} }
fn map_graphql_error(gql_error: crate::gql_client::GraphQLError) -> GraphQLError {
let message = gql_error.message().to_string();
let json = gql_error.json();
if let Some(json) = json {
if !json.is_empty() {
return GraphQLError::DomainError {
message,
fields: GraphqlErrorMessages(json.into_iter().map(|e| e.message).collect()),
};
}
}
GraphQLError::HttpError(message)
}
#[derive(Error, Debug)]
pub enum GraphQLError {
#[error("http error: {0}")]
HttpError(String),
#[error("domain error:\n{message}\n{fields}")]
DomainError {
message: String,
fields: GraphqlErrorMessages,
},
}
#[derive(Debug, Clone)]
pub struct GraphqlErrorMessages(Vec<String>);
impl std::fmt::Display for GraphqlErrorMessages {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
for error in self.0.iter() {
f.write_fmt(format_args!("{error}\n"))?;
}
Ok(())
}
}

View File

@ -1,6 +1,6 @@
#![deny(warnings)] #![deny(warnings)]
pub const DAGGER_ENGINE_VERSION: &'static str = "0.5.1"; pub const DAGGER_ENGINE_VERSION: &'static str = "0.4.2";
pub mod cli_session; pub mod cli_session;
pub mod config; pub mod config;

View File

@ -6,67 +6,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to and this project adheres to
[Semantic Versioning](https://semver.org/spec/v2.0.0.html). [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## v0.2.22 (2023-04-29)
### New Features
- <csr-id-2a29a66217fa4d6c530ea1ce670c8836383e7051/> dagger-run support
- <csr-id-eb7470c604169d1a15976078c0889d5cc7011257/> update to dagger-5.1
### Commit Statistics
<csr-read-only-do-not-edit/>
- 2 commits contributed to the release.
- 4 days passed between releases.
- 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**
- dagger-run support ([`2a29a66`](https://github.com/kjuulh/dagger-sdk/commit/2a29a66217fa4d6c530ea1ce670c8836383e7051))
- update to dagger-5.1 ([`eb7470c`](https://github.com/kjuulh/dagger-sdk/commit/eb7470c604169d1a15976078c0889d5cc7011257))
</details>
## v0.2.21 (2023-04-25)
<csr-id-09881ee39bdfb9201d104e4679a51c3b76b5fe27/>
### Chore
- <csr-id-09881ee39bdfb9201d104e4679a51c3b76b5fe27/> add new dagger-core-version
### Commit Statistics
<csr-read-only-do-not-edit/>
- 2 commits contributed to the release.
- 21 days passed between releases.
- 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.21 ([`6937ef0`](https://github.com/kjuulh/dagger-sdk/commit/6937ef0ace797315013513aa7e2af39a9206a738))
- add new dagger-core-version ([`09881ee`](https://github.com/kjuulh/dagger-sdk/commit/09881ee39bdfb9201d104e4679a51c3b76b5fe27))
</details>
## v0.2.20 (2023-04-03) ## v0.2.20 (2023-04-03)
<csr-id-ea27fa8168cc54b20fac87c016f479061c6eda91/>
<csr-id-6ef4bdf587e4aea290b722e7a0aed3184e72d6bb/>
<csr-id-b55bcc159ffc6a61ecfcc5e3aa3de00a1a73b5b8/>
### Chore ### Chore
- <csr-id-ea27fa8168cc54b20fac87c016f479061c6eda91/> fmt - <csr-id-ea27fa8168cc54b20fac87c016f479061c6eda91/> fmt
@ -94,8 +35,8 @@ and this project adheres to
<csr-read-only-do-not-edit/> <csr-read-only-do-not-edit/>
- 11 commits contributed to the release over the course of 19 calendar days. - 10 commits contributed to the release over the course of 19 calendar days.
- 20 days passed between releases. - 19 days passed between releases.
- 10 commits were understood as [conventional](https://www.conventionalcommits.org). - 10 commits were understood as [conventional](https://www.conventionalcommits.org).
- 1 unique issue was worked on: [#48](https://github.com/kjuulh/dagger-sdk/issues/48) - 1 unique issue was worked on: [#48](https://github.com/kjuulh/dagger-sdk/issues/48)
@ -108,7 +49,6 @@ and this project adheres to
* **[#48](https://github.com/kjuulh/dagger-sdk/issues/48)** * **[#48](https://github.com/kjuulh/dagger-sdk/issues/48)**
- extract client ([`11d2093`](https://github.com/kjuulh/dagger-sdk/commit/11d20935c697e28caaa671e8da0e70a99d4310fc)) - extract client ([`11d2093`](https://github.com/kjuulh/dagger-sdk/commit/11d20935c697e28caaa671e8da0e70a99d4310fc))
* **Uncategorized** * **Uncategorized**
- Release dagger-core v0.2.9, dagger-sdk v0.2.20 ([`f82075c`](https://github.com/kjuulh/dagger-sdk/commit/f82075c23808073d9500df63c1cd347cd9b99cef))
- with gen ([`9ea1870`](https://github.com/kjuulh/dagger-sdk/commit/9ea18700e78a7ee09f43e6976b0339dfc2747458)) - with gen ([`9ea1870`](https://github.com/kjuulh/dagger-sdk/commit/9ea18700e78a7ee09f43e6976b0339dfc2747458))
- update rust crate futures to 0.3.28 ([`696007c`](https://github.com/kjuulh/dagger-sdk/commit/696007cf45ccbdfc1b8eb45e726940a040f52494)) - update rust crate futures to 0.3.28 ([`696007c`](https://github.com/kjuulh/dagger-sdk/commit/696007cf45ccbdfc1b8eb45e726940a040f52494))
- rename projects to point to github/kjuulh/dagger-sdk ([`384294b`](https://github.com/kjuulh/dagger-sdk/commit/384294b39038123b02c406a1038105b111c3b9be)) - rename projects to point to github/kjuulh/dagger-sdk ([`384294b`](https://github.com/kjuulh/dagger-sdk/commit/384294b39038123b02c406a1038105b111c3b9be))

View File

@ -1,6 +1,6 @@
[package] [package]
name = "dagger-sdk" name = "dagger-sdk"
version = "0.2.22" version = "0.2.20"
edition = "2021" edition = "2021"
readme = "README.md" readme = "README.md"
license-file = "LICENSE.MIT" license-file = "LICENSE.MIT"
@ -11,7 +11,7 @@ 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]
dagger-core = { workspace = true, version = "^0.2.11" } dagger-core = { workspace = true }
eyre = { workspace = true } eyre = { workspace = true }
tokio = { workspace = true } tokio = { workspace = true }
@ -19,7 +19,6 @@ serde = { workspace = true }
serde_json = { workspace = true } serde_json = { workspace = true }
tracing.workspace = true tracing.workspace = true
tracing-subscriber.workspace = true tracing-subscriber.workspace = true
thiserror.workspace = true
futures = "0.3.28" futures = "0.3.28"
derive_builder = "0.12.0" derive_builder = "0.12.0"

View File

@ -7,7 +7,7 @@ async fn main() -> eyre::Result<()> {
let host_source_dir = client.host().directory_opts( let host_source_dir = client.host().directory_opts(
"./examples/caching/app", "./examples/caching/app",
dagger_sdk::HostDirectoryOptsBuilder::default() dagger_sdk::HostDirectoryOptsBuilder::default()
.exclude(vec!["node_modules/", "ci/"]) .exclude(vec!["node_modules", "ci/"])
.build()?, .build()?,
); );

View File

@ -5,27 +5,23 @@ use dagger_core::graphql_client::DefaultGraphQLClient;
use dagger_core::config::Config; use dagger_core::config::Config;
use dagger_core::engine::Engine as DaggerEngine; use dagger_core::engine::Engine as DaggerEngine;
use crate::errors::ConnectError;
use crate::gen::Query; use crate::gen::Query;
use crate::logging::StdLogger; use crate::logging::StdLogger;
use crate::querybuilder::query; use crate::querybuilder::query;
pub type DaggerConn = Arc<Query>; pub type DaggerConn = Arc<Query>;
pub async fn connect() -> Result<DaggerConn, ConnectError> { pub async fn connect() -> eyre::Result<DaggerConn> {
let cfg = Config::new(None, None, None, None, Some(Arc::new(StdLogger::default()))); let cfg = Config::new(None, None, None, None, Some(Arc::new(StdLogger::default())));
connect_opts(cfg).await connect_opts(cfg).await
} }
pub async fn connect_opts(cfg: Config) -> Result<DaggerConn, ConnectError> { pub async fn connect_opts(cfg: Config) -> eyre::Result<DaggerConn> {
let (conn, proc) = DaggerEngine::new() let (conn, proc) = DaggerEngine::new().start(&cfg).await?;
.start(&cfg)
.await
.map_err(ConnectError::FailedToConnect)?;
Ok(Arc::new(Query { Ok(Arc::new(Query {
proc: proc.map(|p| Arc::new(p)), proc: Arc::new(proc),
selection: query(), selection: query(),
graphql_client: Arc::new(DefaultGraphQLClient::new(&conn)), graphql_client: Arc::new(DefaultGraphQLClient::new(&conn)),
})) }))

View File

@ -1,27 +0,0 @@
use thiserror::Error;
#[derive(Error, Debug)]
pub enum ConnectError {
#[error("failed to connect to dagger engine")]
FailedToConnect(#[source] eyre::Error),
}
#[derive(Error, Debug)]
pub enum DaggerError {
#[error("failed to build dagger internal graph")]
Build(#[source] eyre::Error),
#[error("failed to parse input type")]
Serialize(#[source] eyre::Error),
#[error("failed to query dagger engine: {0}")]
Query(#[source] dagger_core::graphql_client::GraphQLError),
#[error("failed to unpack response")]
Unpack(#[source] DaggerUnpackError),
}
#[derive(Error, Debug)]
pub enum DaggerUnpackError {
#[error("Too many nested objects inside graphql response")]
TooManyNestedObjects,
#[error("failed to deserialize response")]
Deserialize(#[source] serde_json::Error),
}

View File

@ -1,4 +1,3 @@
use crate::errors::DaggerError;
use crate::querybuilder::Selection; use crate::querybuilder::Selection;
use dagger_core::graphql_client::DynGraphQLClient; use dagger_core::graphql_client::DynGraphQLClient;
use derive_builder::Builder; use derive_builder::Builder;
@ -116,13 +115,13 @@ pub struct PipelineLabel {
} }
#[derive(Clone)] #[derive(Clone)]
pub struct CacheVolume { pub struct CacheVolume {
pub proc: Option<Arc<Child>>, pub proc: Arc<Child>,
pub selection: Selection, pub selection: Selection,
pub graphql_client: DynGraphQLClient, pub graphql_client: DynGraphQLClient,
} }
impl CacheVolume { impl CacheVolume {
pub async fn id(&self) -> Result<CacheId, DaggerError> { pub async fn id(&self) -> eyre::Result<CacheId> {
let query = self.selection.select("id"); let query = self.selection.select("id");
query.execute(self.graphql_client.clone()).await query.execute(self.graphql_client.clone()).await
@ -130,7 +129,7 @@ impl CacheVolume {
} }
#[derive(Clone)] #[derive(Clone)]
pub struct Container { pub struct Container {
pub proc: Option<Arc<Child>>, pub proc: Arc<Child>,
pub selection: Selection, pub selection: Selection,
pub graphql_client: DynGraphQLClient, pub graphql_client: DynGraphQLClient,
} }
@ -144,10 +143,6 @@ pub struct ContainerBuildOpts<'a> {
/// Default: './Dockerfile'. /// Default: './Dockerfile'.
#[builder(setter(into, strip_option), default)] #[builder(setter(into, strip_option), default)]
pub dockerfile: Option<&'a str>, pub dockerfile: Option<&'a str>,
/// Secrets to pass to the build.
/// They will be mounted at /run/secrets/[secret-name].
#[builder(setter(into, strip_option), default)]
pub secrets: Option<Vec<SecretId>>,
/// Target build stage to build. /// Target build stage to build.
#[builder(setter(into, strip_option), default)] #[builder(setter(into, strip_option), default)]
pub target: Option<&'a str>, pub target: Option<&'a str>,
@ -189,13 +184,6 @@ pub struct ContainerExportOpts {
pub platform_variants: Option<Vec<ContainerId>>, pub platform_variants: Option<Vec<ContainerId>>,
} }
#[derive(Builder, Debug, PartialEq)] #[derive(Builder, Debug, PartialEq)]
pub struct ContainerImportOpts<'a> {
/// Identifies the tag to import from the archive, if the archive bundles
/// multiple tags.
#[builder(setter(into, strip_option), default)]
pub tag: Option<&'a str>,
}
#[derive(Builder, Debug, PartialEq)]
pub struct ContainerPipelineOpts<'a> { pub struct ContainerPipelineOpts<'a> {
/// Pipeline description. /// Pipeline description.
#[builder(setter(into, strip_option), default)] #[builder(setter(into, strip_option), default)]
@ -225,11 +213,6 @@ pub struct ContainerWithDirectoryOpts<'a> {
/// Patterns to include in the written directory (e.g., ["*.go", "go.mod", "go.sum"]). /// Patterns to include in the written directory (e.g., ["*.go", "go.mod", "go.sum"]).
#[builder(setter(into, strip_option), default)] #[builder(setter(into, strip_option), default)]
pub include: Option<Vec<&'a str>>, pub include: Option<Vec<&'a str>>,
/// A user:group to set for the directory and its contents.
/// The user and group can either be an ID (1000:1000) or a name (foo:bar).
/// If the group is omitted, it defaults to the same as the user.
#[builder(setter(into, strip_option), default)]
pub owner: Option<&'a str>,
} }
#[derive(Builder, Debug, PartialEq)] #[derive(Builder, Debug, PartialEq)]
pub struct ContainerWithExecOpts<'a> { pub struct ContainerWithExecOpts<'a> {
@ -250,9 +233,6 @@ pub struct ContainerWithExecOpts<'a> {
/// Redirect the command's standard output to a file in the container (e.g., "/tmp/stdout"). /// Redirect the command's standard output to a file in the container (e.g., "/tmp/stdout").
#[builder(setter(into, strip_option), default)] #[builder(setter(into, strip_option), default)]
pub redirect_stdout: Option<&'a str>, pub redirect_stdout: Option<&'a str>,
/// If the container has an entrypoint, ignore it for args rather than using it to wrap them.
#[builder(setter(into, strip_option), default)]
pub skip_entrypoint: Option<bool>,
/// Content to write to the command's standard input before closing (e.g., "Hello world"). /// Content to write to the command's standard input before closing (e.g., "Hello world").
#[builder(setter(into, strip_option), default)] #[builder(setter(into, strip_option), default)]
pub stdin: Option<&'a str>, pub stdin: Option<&'a str>,
@ -267,27 +247,14 @@ pub struct ContainerWithExposedPortOpts<'a> {
pub protocol: Option<NetworkProtocol>, pub protocol: Option<NetworkProtocol>,
} }
#[derive(Builder, Debug, PartialEq)] #[derive(Builder, Debug, PartialEq)]
pub struct ContainerWithFileOpts<'a> { pub struct ContainerWithFileOpts {
/// A user:group to set for the file.
/// The user and group can either be an ID (1000:1000) or a name (foo:bar).
/// If the group is omitted, it defaults to the same as the user.
#[builder(setter(into, strip_option), default)]
pub owner: Option<&'a str>,
/// Permission given to the copied file (e.g., 0600). /// Permission given to the copied file (e.g., 0600).
/// Default: 0644. /// Default: 0644.
#[builder(setter(into, strip_option), default)] #[builder(setter(into, strip_option), default)]
pub permissions: Option<isize>, pub permissions: Option<isize>,
} }
#[derive(Builder, Debug, PartialEq)] #[derive(Builder, Debug, PartialEq)]
pub struct ContainerWithMountedCacheOpts<'a> { pub struct ContainerWithMountedCacheOpts {
/// A user:group to set for the mounted cache directory.
/// Note that this changes the ownership of the specified mount along with the
/// initial filesystem provided by source (if any). It does not have any effect
/// if/when the cache has already been created.
/// The user and group can either be an ID (1000:1000) or a name (foo:bar).
/// If the group is omitted, it defaults to the same as the user.
#[builder(setter(into, strip_option), default)]
pub owner: Option<&'a str>,
/// Sharing mode of the cache volume. /// Sharing mode of the cache volume.
#[builder(setter(into, strip_option), default)] #[builder(setter(into, strip_option), default)]
pub sharing: Option<CacheSharingMode>, pub sharing: Option<CacheSharingMode>,
@ -296,53 +263,16 @@ pub struct ContainerWithMountedCacheOpts<'a> {
pub source: Option<DirectoryId>, pub source: Option<DirectoryId>,
} }
#[derive(Builder, Debug, PartialEq)] #[derive(Builder, Debug, PartialEq)]
pub struct ContainerWithMountedDirectoryOpts<'a> {
/// A user:group to set for the mounted directory and its contents.
/// The user and group can either be an ID (1000:1000) or a name (foo:bar).
/// If the group is omitted, it defaults to the same as the user.
#[builder(setter(into, strip_option), default)]
pub owner: Option<&'a str>,
}
#[derive(Builder, Debug, PartialEq)]
pub struct ContainerWithMountedFileOpts<'a> {
/// A user or user:group to set for the mounted file.
/// The user and group can either be an ID (1000:1000) or a name (foo:bar).
/// If the group is omitted, it defaults to the same as the user.
#[builder(setter(into, strip_option), default)]
pub owner: Option<&'a str>,
}
#[derive(Builder, Debug, PartialEq)]
pub struct ContainerWithMountedSecretOpts<'a> {
/// A user:group to set for the mounted secret.
/// The user and group can either be an ID (1000:1000) or a name (foo:bar).
/// If the group is omitted, it defaults to the same as the user.
#[builder(setter(into, strip_option), default)]
pub owner: Option<&'a str>,
}
#[derive(Builder, Debug, PartialEq)]
pub struct ContainerWithNewFileOpts<'a> { pub struct ContainerWithNewFileOpts<'a> {
/// Content of the file to write (e.g., "Hello world!"). /// Content of the file to write (e.g., "Hello world!").
#[builder(setter(into, strip_option), default)] #[builder(setter(into, strip_option), default)]
pub contents: Option<&'a str>, pub contents: Option<&'a str>,
/// A user:group to set for the file.
/// The user and group can either be an ID (1000:1000) or a name (foo:bar).
/// If the group is omitted, it defaults to the same as the user.
#[builder(setter(into, strip_option), default)]
pub owner: Option<&'a str>,
/// Permission given to the written file (e.g., 0600). /// Permission given to the written file (e.g., 0600).
/// Default: 0644. /// Default: 0644.
#[builder(setter(into, strip_option), default)] #[builder(setter(into, strip_option), default)]
pub permissions: Option<isize>, pub permissions: Option<isize>,
} }
#[derive(Builder, Debug, PartialEq)] #[derive(Builder, Debug, PartialEq)]
pub struct ContainerWithUnixSocketOpts<'a> {
/// A user:group to set for the mounted socket.
/// The user and group can either be an ID (1000:1000) or a name (foo:bar).
/// If the group is omitted, it defaults to the same as the user.
#[builder(setter(into, strip_option), default)]
pub owner: Option<&'a str>,
}
#[derive(Builder, Debug, PartialEq)]
pub struct ContainerWithoutExposedPortOpts { pub struct ContainerWithoutExposedPortOpts {
/// Port protocol to unexpose /// Port protocol to unexpose
#[builder(setter(into, strip_option), default)] #[builder(setter(into, strip_option), default)]
@ -387,9 +317,6 @@ impl Container {
if let Some(target) = opts.target { if let Some(target) = opts.target {
query = query.arg("target", target); query = query.arg("target", target);
} }
if let Some(secrets) = opts.secrets {
query = query.arg("secrets", secrets);
}
return Container { return Container {
proc: self.proc.clone(), proc: self.proc.clone(),
@ -398,7 +325,7 @@ impl Container {
}; };
} }
/// Retrieves default arguments for future commands. /// Retrieves default arguments for future commands.
pub async fn default_args(&self) -> Result<Vec<String>, DaggerError> { pub async fn default_args(&self) -> eyre::Result<Vec<String>> {
let query = self.selection.select("defaultArgs"); let query = self.selection.select("defaultArgs");
query.execute(self.graphql_client.clone()).await query.execute(self.graphql_client.clone()).await
@ -428,7 +355,7 @@ impl Container {
/// # Arguments /// # Arguments
/// ///
/// * `opt` - optional argument, see inner type for documentation, use <func>_opts to use /// * `opt` - optional argument, see inner type for documentation, use <func>_opts to use
pub async fn endpoint(&self) -> Result<String, DaggerError> { pub async fn endpoint(&self) -> eyre::Result<String> {
let query = self.selection.select("endpoint"); let query = self.selection.select("endpoint");
query.execute(self.graphql_client.clone()).await query.execute(self.graphql_client.clone()).await
@ -442,10 +369,7 @@ impl Container {
/// # Arguments /// # Arguments
/// ///
/// * `opt` - optional argument, see inner type for documentation, use <func>_opts to use /// * `opt` - optional argument, see inner type for documentation, use <func>_opts to use
pub async fn endpoint_opts<'a>( pub async fn endpoint_opts<'a>(&self, opts: ContainerEndpointOpts<'a>) -> eyre::Result<String> {
&self,
opts: ContainerEndpointOpts<'a>,
) -> Result<String, DaggerError> {
let mut query = self.selection.select("endpoint"); let mut query = self.selection.select("endpoint");
if let Some(port) = opts.port { if let Some(port) = opts.port {
@ -458,7 +382,7 @@ impl Container {
query.execute(self.graphql_client.clone()).await query.execute(self.graphql_client.clone()).await
} }
/// Retrieves entrypoint to be prepended to the arguments of all commands. /// Retrieves entrypoint to be prepended to the arguments of all commands.
pub async fn entrypoint(&self) -> Result<Vec<String>, DaggerError> { pub async fn entrypoint(&self) -> eyre::Result<Vec<String>> {
let query = self.selection.select("entrypoint"); let query = self.selection.select("entrypoint");
query.execute(self.graphql_client.clone()).await query.execute(self.graphql_client.clone()).await
@ -468,7 +392,7 @@ impl Container {
/// # Arguments /// # Arguments
/// ///
/// * `name` - The name of the environment variable to retrieve (e.g., "PATH"). /// * `name` - The name of the environment variable to retrieve (e.g., "PATH").
pub async fn env_variable(&self, name: impl Into<String>) -> Result<String, DaggerError> { pub async fn env_variable(&self, name: impl Into<String>) -> eyre::Result<String> {
let mut query = self.selection.select("envVariable"); let mut query = self.selection.select("envVariable");
query = query.arg("name", name.into()); query = query.arg("name", name.into());
@ -534,8 +458,8 @@ impl Container {
}; };
} }
/// Exit code of the last executed command. Zero means success. /// Exit code of the last executed command. Zero means success.
/// Will execute default command if none is set, or error if there's no default. /// Errors if no command has been executed.
pub async fn exit_code(&self) -> Result<isize, DaggerError> { pub async fn exit_code(&self) -> eyre::Result<isize> {
let query = self.selection.select("exitCode"); let query = self.selection.select("exitCode");
query.execute(self.graphql_client.clone()).await query.execute(self.graphql_client.clone()).await
@ -549,7 +473,7 @@ impl Container {
/// * `path` - Host's destination path (e.g., "./tarball"). /// * `path` - Host's destination path (e.g., "./tarball").
/// Path can be relative to the engine's workdir or absolute. /// Path can be relative to the engine's workdir or absolute.
/// * `opt` - optional argument, see inner type for documentation, use <func>_opts to use /// * `opt` - optional argument, see inner type for documentation, use <func>_opts to use
pub async fn export(&self, path: impl Into<String>) -> Result<bool, DaggerError> { pub async fn export(&self, path: impl Into<String>) -> eyre::Result<bool> {
let mut query = self.selection.select("export"); let mut query = self.selection.select("export");
query = query.arg("path", path.into()); query = query.arg("path", path.into());
@ -570,7 +494,7 @@ impl Container {
&self, &self,
path: impl Into<String>, path: impl Into<String>,
opts: ContainerExportOpts, opts: ContainerExportOpts,
) -> Result<bool, DaggerError> { ) -> eyre::Result<bool> {
let mut query = self.selection.select("export"); let mut query = self.selection.select("export");
query = query.arg("path", path.into()); query = query.arg("path", path.into());
@ -638,67 +562,25 @@ impl Container {
} }
/// Retrieves a hostname which can be used by clients to reach this container. /// Retrieves a hostname which can be used by clients to reach this container.
/// Currently experimental; set _EXPERIMENTAL_DAGGER_SERVICES_DNS=0 to disable. /// Currently experimental; set _EXPERIMENTAL_DAGGER_SERVICES_DNS=0 to disable.
pub async fn hostname(&self) -> Result<String, DaggerError> { pub async fn hostname(&self) -> eyre::Result<String> {
let query = self.selection.select("hostname"); let query = self.selection.select("hostname");
query.execute(self.graphql_client.clone()).await query.execute(self.graphql_client.clone()).await
} }
/// A unique identifier for this container. /// A unique identifier for this container.
pub async fn id(&self) -> Result<ContainerId, DaggerError> { pub async fn id(&self) -> eyre::Result<ContainerId> {
let query = self.selection.select("id"); let query = self.selection.select("id");
query.execute(self.graphql_client.clone()).await query.execute(self.graphql_client.clone()).await
} }
/// The unique image reference which can only be retrieved immediately after the 'Container.From' call. /// The unique image reference which can only be retrieved immediately after the 'Container.From' call.
pub async fn image_ref(&self) -> Result<String, DaggerError> { pub async fn image_ref(&self) -> eyre::Result<String> {
let query = self.selection.select("imageRef"); let query = self.selection.select("imageRef");
query.execute(self.graphql_client.clone()).await query.execute(self.graphql_client.clone()).await
} }
/// Reads the container from an OCI tarball.
/// NOTE: this involves unpacking the tarball to an OCI store on the host at
/// $XDG_CACHE_DIR/dagger/oci. This directory can be removed whenever you like.
///
/// # Arguments
///
/// * `source` - File to read the container from.
/// * `opt` - optional argument, see inner type for documentation, use <func>_opts to use
pub fn import(&self, source: FileId) -> Container {
let mut query = self.selection.select("import");
query = query.arg("source", source);
return Container {
proc: self.proc.clone(),
selection: query,
graphql_client: self.graphql_client.clone(),
};
}
/// Reads the container from an OCI tarball.
/// NOTE: this involves unpacking the tarball to an OCI store on the host at
/// $XDG_CACHE_DIR/dagger/oci. This directory can be removed whenever you like.
///
/// # Arguments
///
/// * `source` - File to read the container from.
/// * `opt` - optional argument, see inner type for documentation, use <func>_opts to use
pub fn import_opts<'a>(&self, source: FileId, opts: ContainerImportOpts<'a>) -> Container {
let mut query = self.selection.select("import");
query = query.arg("source", source);
if let Some(tag) = opts.tag {
query = query.arg("tag", tag);
}
return Container {
proc: self.proc.clone(),
selection: query,
graphql_client: self.graphql_client.clone(),
};
}
/// Retrieves the value of the specified label. /// Retrieves the value of the specified label.
pub async fn label(&self, name: impl Into<String>) -> Result<String, DaggerError> { pub async fn label(&self, name: impl Into<String>) -> eyre::Result<String> {
let mut query = self.selection.select("label"); let mut query = self.selection.select("label");
query = query.arg("name", name.into()); query = query.arg("name", name.into());
@ -716,7 +598,7 @@ impl Container {
}]; }];
} }
/// Retrieves the list of paths where a directory is mounted. /// Retrieves the list of paths where a directory is mounted.
pub async fn mounts(&self) -> Result<Vec<String>, DaggerError> { pub async fn mounts(&self) -> eyre::Result<Vec<String>> {
let query = self.selection.select("mounts"); let query = self.selection.select("mounts");
query.execute(self.graphql_client.clone()).await query.execute(self.graphql_client.clone()).await
@ -767,7 +649,7 @@ impl Container {
}; };
} }
/// The platform this container executes and publishes as. /// The platform this container executes and publishes as.
pub async fn platform(&self) -> Result<Platform, DaggerError> { pub async fn platform(&self) -> eyre::Result<Platform> {
let query = self.selection.select("platform"); let query = self.selection.select("platform");
query.execute(self.graphql_client.clone()).await query.execute(self.graphql_client.clone()).await
@ -782,7 +664,7 @@ impl Container {
/// ///
/// Formatted as [host]/[user]/[repo]:[tag] (e.g. "docker.io/dagger/dagger:main"). /// Formatted as [host]/[user]/[repo]:[tag] (e.g. "docker.io/dagger/dagger:main").
/// * `opt` - optional argument, see inner type for documentation, use <func>_opts to use /// * `opt` - optional argument, see inner type for documentation, use <func>_opts to use
pub async fn publish(&self, address: impl Into<String>) -> Result<String, DaggerError> { pub async fn publish(&self, address: impl Into<String>) -> eyre::Result<String> {
let mut query = self.selection.select("publish"); let mut query = self.selection.select("publish");
query = query.arg("address", address.into()); query = query.arg("address", address.into());
@ -804,7 +686,7 @@ impl Container {
&self, &self,
address: impl Into<String>, address: impl Into<String>,
opts: ContainerPublishOpts, opts: ContainerPublishOpts,
) -> Result<String, DaggerError> { ) -> eyre::Result<String> {
let mut query = self.selection.select("publish"); let mut query = self.selection.select("publish");
query = query.arg("address", address.into()); query = query.arg("address", address.into());
@ -825,21 +707,21 @@ impl Container {
}; };
} }
/// The error stream of the last executed command. /// The error stream of the last executed command.
/// Will execute default command if none is set, or error if there's no default. /// Errors if no command has been executed.
pub async fn stderr(&self) -> Result<String, DaggerError> { pub async fn stderr(&self) -> eyre::Result<String> {
let query = self.selection.select("stderr"); let query = self.selection.select("stderr");
query.execute(self.graphql_client.clone()).await query.execute(self.graphql_client.clone()).await
} }
/// The output stream of the last executed command. /// The output stream of the last executed command.
/// Will execute default command if none is set, or error if there's no default. /// Errors if no command has been executed.
pub async fn stdout(&self) -> Result<String, DaggerError> { pub async fn stdout(&self) -> eyre::Result<String> {
let query = self.selection.select("stdout"); let query = self.selection.select("stdout");
query.execute(self.graphql_client.clone()).await query.execute(self.graphql_client.clone()).await
} }
/// Retrieves the user to be set for all commands. /// Retrieves the user to be set for all commands.
pub async fn user(&self) -> Result<String, DaggerError> { pub async fn user(&self) -> eyre::Result<String> {
let query = self.selection.select("user"); let query = self.selection.select("user");
query.execute(self.graphql_client.clone()).await query.execute(self.graphql_client.clone()).await
@ -920,9 +802,6 @@ impl Container {
if let Some(include) = opts.include { if let Some(include) = opts.include {
query = query.arg("include", include); query = query.arg("include", include);
} }
if let Some(owner) = opts.owner {
query = query.arg("owner", owner);
}
return Container { return Container {
proc: self.proc.clone(), proc: self.proc.clone(),
@ -976,8 +855,6 @@ impl Container {
/// # Arguments /// # Arguments
/// ///
/// * `args` - Command to run instead of the container's default command (e.g., ["run", "main.go"]). /// * `args` - Command to run instead of the container's default command (e.g., ["run", "main.go"]).
///
/// If empty, the container's default command is used.
/// * `opt` - optional argument, see inner type for documentation, use <func>_opts to use /// * `opt` - optional argument, see inner type for documentation, use <func>_opts to use
pub fn with_exec(&self, args: Vec<impl Into<String>>) -> Container { pub fn with_exec(&self, args: Vec<impl Into<String>>) -> Container {
let mut query = self.selection.select("withExec"); let mut query = self.selection.select("withExec");
@ -999,8 +876,6 @@ impl Container {
/// # Arguments /// # Arguments
/// ///
/// * `args` - Command to run instead of the container's default command (e.g., ["run", "main.go"]). /// * `args` - Command to run instead of the container's default command (e.g., ["run", "main.go"]).
///
/// If empty, the container's default command is used.
/// * `opt` - optional argument, see inner type for documentation, use <func>_opts to use /// * `opt` - optional argument, see inner type for documentation, use <func>_opts to use
pub fn with_exec_opts<'a>( pub fn with_exec_opts<'a>(
&self, &self,
@ -1013,9 +888,6 @@ impl Container {
"args", "args",
args.into_iter().map(|i| i.into()).collect::<Vec<String>>(), args.into_iter().map(|i| i.into()).collect::<Vec<String>>(),
); );
if let Some(skip_entrypoint) = opts.skip_entrypoint {
query = query.arg("skipEntrypoint", skip_entrypoint);
}
if let Some(stdin) = opts.stdin { if let Some(stdin) = opts.stdin {
query = query.arg("stdin", stdin); query = query.arg("stdin", stdin);
} }
@ -1133,11 +1005,11 @@ impl Container {
/// * `path` - Location of the copied file (e.g., "/tmp/file.txt"). /// * `path` - Location of the copied file (e.g., "/tmp/file.txt").
/// * `source` - Identifier of the file to copy. /// * `source` - Identifier of the file to copy.
/// * `opt` - optional argument, see inner type for documentation, use <func>_opts to use /// * `opt` - optional argument, see inner type for documentation, use <func>_opts to use
pub fn with_file_opts<'a>( pub fn with_file_opts(
&self, &self,
path: impl Into<String>, path: impl Into<String>,
source: FileId, source: FileId,
opts: ContainerWithFileOpts<'a>, opts: ContainerWithFileOpts,
) -> Container { ) -> Container {
let mut query = self.selection.select("withFile"); let mut query = self.selection.select("withFile");
@ -1146,9 +1018,6 @@ impl Container {
if let Some(permissions) = opts.permissions { if let Some(permissions) = opts.permissions {
query = query.arg("permissions", permissions); query = query.arg("permissions", permissions);
} }
if let Some(owner) = opts.owner {
query = query.arg("owner", owner);
}
return Container { return Container {
proc: self.proc.clone(), proc: self.proc.clone(),
@ -1201,11 +1070,11 @@ impl Container {
/// * `path` - Location of the cache directory (e.g., "/cache/node_modules"). /// * `path` - Location of the cache directory (e.g., "/cache/node_modules").
/// * `cache` - Identifier of the cache volume to mount. /// * `cache` - Identifier of the cache volume to mount.
/// * `opt` - optional argument, see inner type for documentation, use <func>_opts to use /// * `opt` - optional argument, see inner type for documentation, use <func>_opts to use
pub fn with_mounted_cache_opts<'a>( pub fn with_mounted_cache_opts(
&self, &self,
path: impl Into<String>, path: impl Into<String>,
cache: CacheId, cache: CacheId,
opts: ContainerWithMountedCacheOpts<'a>, opts: ContainerWithMountedCacheOpts,
) -> Container { ) -> Container {
let mut query = self.selection.select("withMountedCache"); let mut query = self.selection.select("withMountedCache");
@ -1217,9 +1086,6 @@ impl Container {
if let Some(sharing) = opts.sharing { if let Some(sharing) = opts.sharing {
query = query.arg_enum("sharing", sharing); query = query.arg_enum("sharing", sharing);
} }
if let Some(owner) = opts.owner {
query = query.arg("owner", owner);
}
return Container { return Container {
proc: self.proc.clone(), proc: self.proc.clone(),
@ -1233,7 +1099,6 @@ impl Container {
/// ///
/// * `path` - Location of the mounted directory (e.g., "/mnt/directory"). /// * `path` - Location of the mounted directory (e.g., "/mnt/directory").
/// * `source` - Identifier of the mounted directory. /// * `source` - Identifier of the mounted directory.
/// * `opt` - optional argument, see inner type for documentation, use <func>_opts to use
pub fn with_mounted_directory( pub fn with_mounted_directory(
&self, &self,
path: impl Into<String>, path: impl Into<String>,
@ -1250,41 +1115,12 @@ impl Container {
graphql_client: self.graphql_client.clone(), graphql_client: self.graphql_client.clone(),
}; };
} }
/// Retrieves this container plus a directory mounted at the given path.
///
/// # Arguments
///
/// * `path` - Location of the mounted directory (e.g., "/mnt/directory").
/// * `source` - Identifier of the mounted directory.
/// * `opt` - optional argument, see inner type for documentation, use <func>_opts to use
pub fn with_mounted_directory_opts<'a>(
&self,
path: impl Into<String>,
source: DirectoryId,
opts: ContainerWithMountedDirectoryOpts<'a>,
) -> Container {
let mut query = self.selection.select("withMountedDirectory");
query = query.arg("path", path.into());
query = query.arg("source", source);
if let Some(owner) = opts.owner {
query = query.arg("owner", owner);
}
return Container {
proc: self.proc.clone(),
selection: query,
graphql_client: self.graphql_client.clone(),
};
}
/// Retrieves this container plus a file mounted at the given path. /// Retrieves this container plus a file mounted at the given path.
/// ///
/// # Arguments /// # Arguments
/// ///
/// * `path` - Location of the mounted file (e.g., "/tmp/file.txt"). /// * `path` - Location of the mounted file (e.g., "/tmp/file.txt").
/// * `source` - Identifier of the mounted file. /// * `source` - Identifier of the mounted file.
/// * `opt` - optional argument, see inner type for documentation, use <func>_opts to use
pub fn with_mounted_file(&self, path: impl Into<String>, source: FileId) -> Container { pub fn with_mounted_file(&self, path: impl Into<String>, source: FileId) -> Container {
let mut query = self.selection.select("withMountedFile"); let mut query = self.selection.select("withMountedFile");
@ -1297,41 +1133,12 @@ impl Container {
graphql_client: self.graphql_client.clone(), graphql_client: self.graphql_client.clone(),
}; };
} }
/// Retrieves this container plus a file mounted at the given path.
///
/// # Arguments
///
/// * `path` - Location of the mounted file (e.g., "/tmp/file.txt").
/// * `source` - Identifier of the mounted file.
/// * `opt` - optional argument, see inner type for documentation, use <func>_opts to use
pub fn with_mounted_file_opts<'a>(
&self,
path: impl Into<String>,
source: FileId,
opts: ContainerWithMountedFileOpts<'a>,
) -> Container {
let mut query = self.selection.select("withMountedFile");
query = query.arg("path", path.into());
query = query.arg("source", source);
if let Some(owner) = opts.owner {
query = query.arg("owner", owner);
}
return Container {
proc: self.proc.clone(),
selection: query,
graphql_client: self.graphql_client.clone(),
};
}
/// Retrieves this container plus a secret mounted into a file at the given path. /// Retrieves this container plus a secret mounted into a file at the given path.
/// ///
/// # Arguments /// # Arguments
/// ///
/// * `path` - Location of the secret file (e.g., "/tmp/secret.txt"). /// * `path` - Location of the secret file (e.g., "/tmp/secret.txt").
/// * `source` - Identifier of the secret to mount. /// * `source` - Identifier of the secret to mount.
/// * `opt` - optional argument, see inner type for documentation, use <func>_opts to use
pub fn with_mounted_secret(&self, path: impl Into<String>, source: SecretId) -> Container { pub fn with_mounted_secret(&self, path: impl Into<String>, source: SecretId) -> Container {
let mut query = self.selection.select("withMountedSecret"); let mut query = self.selection.select("withMountedSecret");
@ -1344,34 +1151,6 @@ impl Container {
graphql_client: self.graphql_client.clone(), graphql_client: self.graphql_client.clone(),
}; };
} }
/// Retrieves this container plus a secret mounted into a file at the given path.
///
/// # Arguments
///
/// * `path` - Location of the secret file (e.g., "/tmp/secret.txt").
/// * `source` - Identifier of the secret to mount.
/// * `opt` - optional argument, see inner type for documentation, use <func>_opts to use
pub fn with_mounted_secret_opts<'a>(
&self,
path: impl Into<String>,
source: SecretId,
opts: ContainerWithMountedSecretOpts<'a>,
) -> Container {
let mut query = self.selection.select("withMountedSecret");
query = query.arg("path", path.into());
query = query.arg("source", source);
if let Some(owner) = opts.owner {
query = query.arg("owner", owner);
}
return Container {
proc: self.proc.clone(),
selection: query,
graphql_client: self.graphql_client.clone(),
};
}
/// Retrieves this container plus a temporary directory mounted at the given path. /// Retrieves this container plus a temporary directory mounted at the given path.
/// ///
/// # Arguments /// # Arguments
@ -1426,9 +1205,6 @@ impl Container {
if let Some(permissions) = opts.permissions { if let Some(permissions) = opts.permissions {
query = query.arg("permissions", permissions); query = query.arg("permissions", permissions);
} }
if let Some(owner) = opts.owner {
query = query.arg("owner", owner);
}
return Container { return Container {
proc: self.proc.clone(), proc: self.proc.clone(),
@ -1492,9 +1268,7 @@ impl Container {
graphql_client: self.graphql_client.clone(), graphql_client: self.graphql_client.clone(),
}; };
} }
/// Establish a runtime dependency on a service. /// Establish a runtime dependency on a service. The service will be started automatically when needed and detached when it is no longer needed.
/// The service will be started automatically when needed and detached when it is
/// no longer needed, executing the default command if none is set.
/// The service will be reachable from the container via the provided hostname alias. /// The service will be reachable from the container via the provided hostname alias.
/// The service dependency will also convey to any files or directories produced by the container. /// The service dependency will also convey to any files or directories produced by the container.
/// Currently experimental; set _EXPERIMENTAL_DAGGER_SERVICES_DNS=0 to disable. /// Currently experimental; set _EXPERIMENTAL_DAGGER_SERVICES_DNS=0 to disable.
@ -1525,7 +1299,6 @@ impl Container {
/// ///
/// * `path` - Location of the forwarded Unix socket (e.g., "/tmp/socket"). /// * `path` - Location of the forwarded Unix socket (e.g., "/tmp/socket").
/// * `source` - Identifier of the socket to forward. /// * `source` - Identifier of the socket to forward.
/// * `opt` - optional argument, see inner type for documentation, use <func>_opts to use
pub fn with_unix_socket(&self, path: impl Into<String>, source: SocketId) -> Container { pub fn with_unix_socket(&self, path: impl Into<String>, source: SocketId) -> Container {
let mut query = self.selection.select("withUnixSocket"); let mut query = self.selection.select("withUnixSocket");
@ -1538,34 +1311,6 @@ impl Container {
graphql_client: self.graphql_client.clone(), graphql_client: self.graphql_client.clone(),
}; };
} }
/// Retrieves this container plus a socket forwarded to the given Unix socket path.
///
/// # Arguments
///
/// * `path` - Location of the forwarded Unix socket (e.g., "/tmp/socket").
/// * `source` - Identifier of the socket to forward.
/// * `opt` - optional argument, see inner type for documentation, use <func>_opts to use
pub fn with_unix_socket_opts<'a>(
&self,
path: impl Into<String>,
source: SocketId,
opts: ContainerWithUnixSocketOpts<'a>,
) -> Container {
let mut query = self.selection.select("withUnixSocket");
query = query.arg("path", path.into());
query = query.arg("source", source);
if let Some(owner) = opts.owner {
query = query.arg("owner", owner);
}
return Container {
proc: self.proc.clone(),
selection: query,
graphql_client: self.graphql_client.clone(),
};
}
/// Retrieves this container with a different command user. /// Retrieves this container with a different command user.
/// ///
/// # Arguments /// # Arguments
@ -1724,7 +1469,7 @@ impl Container {
}; };
} }
/// Retrieves the working directory for all commands. /// Retrieves the working directory for all commands.
pub async fn workdir(&self) -> Result<String, DaggerError> { pub async fn workdir(&self) -> eyre::Result<String> {
let query = self.selection.select("workdir"); let query = self.selection.select("workdir");
query.execute(self.graphql_client.clone()).await query.execute(self.graphql_client.clone()).await
@ -1732,7 +1477,7 @@ impl Container {
} }
#[derive(Clone)] #[derive(Clone)]
pub struct Directory { pub struct Directory {
pub proc: Option<Arc<Child>>, pub proc: Arc<Child>,
pub selection: Selection, pub selection: Selection,
pub graphql_client: DynGraphQLClient, pub graphql_client: DynGraphQLClient,
} }
@ -1749,10 +1494,6 @@ pub struct DirectoryDockerBuildOpts<'a> {
/// The platform to build. /// The platform to build.
#[builder(setter(into, strip_option), default)] #[builder(setter(into, strip_option), default)]
pub platform: Option<Platform>, pub platform: Option<Platform>,
/// Secrets to pass to the build.
/// They will be mounted at /run/secrets/[secret-name].
#[builder(setter(into, strip_option), default)]
pub secrets: Option<Vec<SecretId>>,
/// Target build stage to build. /// Target build stage to build.
#[builder(setter(into, strip_option), default)] #[builder(setter(into, strip_option), default)]
pub target: Option<&'a str>, pub target: Option<&'a str>,
@ -1871,9 +1612,6 @@ impl Directory {
if let Some(target) = opts.target { if let Some(target) = opts.target {
query = query.arg("target", target); query = query.arg("target", target);
} }
if let Some(secrets) = opts.secrets {
query = query.arg("secrets", secrets);
}
return Container { return Container {
proc: self.proc.clone(), proc: self.proc.clone(),
@ -1886,7 +1624,7 @@ impl Directory {
/// # Arguments /// # Arguments
/// ///
/// * `opt` - optional argument, see inner type for documentation, use <func>_opts to use /// * `opt` - optional argument, see inner type for documentation, use <func>_opts to use
pub async fn entries(&self) -> Result<Vec<String>, DaggerError> { pub async fn entries(&self) -> eyre::Result<Vec<String>> {
let query = self.selection.select("entries"); let query = self.selection.select("entries");
query.execute(self.graphql_client.clone()).await query.execute(self.graphql_client.clone()).await
@ -1900,7 +1638,7 @@ impl Directory {
pub async fn entries_opts<'a>( pub async fn entries_opts<'a>(
&self, &self,
opts: DirectoryEntriesOpts<'a>, opts: DirectoryEntriesOpts<'a>,
) -> Result<Vec<String>, DaggerError> { ) -> eyre::Result<Vec<String>> {
let mut query = self.selection.select("entries"); let mut query = self.selection.select("entries");
if let Some(path) = opts.path { if let Some(path) = opts.path {
@ -1914,7 +1652,7 @@ impl Directory {
/// # Arguments /// # Arguments
/// ///
/// * `path` - Location of the copied directory (e.g., "logs/"). /// * `path` - Location of the copied directory (e.g., "logs/").
pub async fn export(&self, path: impl Into<String>) -> Result<bool, DaggerError> { pub async fn export(&self, path: impl Into<String>) -> eyre::Result<bool> {
let mut query = self.selection.select("export"); let mut query = self.selection.select("export");
query = query.arg("path", path.into()); query = query.arg("path", path.into());
@ -1938,7 +1676,7 @@ impl Directory {
}; };
} }
/// The content-addressed identifier of the directory. /// The content-addressed identifier of the directory.
pub async fn id(&self) -> Result<DirectoryId, DaggerError> { pub async fn id(&self) -> eyre::Result<DirectoryId> {
let query = self.selection.select("id"); let query = self.selection.select("id");
query.execute(self.graphql_client.clone()).await query.execute(self.graphql_client.clone()).await
@ -2239,20 +1977,20 @@ impl Directory {
} }
#[derive(Clone)] #[derive(Clone)]
pub struct EnvVariable { pub struct EnvVariable {
pub proc: Option<Arc<Child>>, pub proc: Arc<Child>,
pub selection: Selection, pub selection: Selection,
pub graphql_client: DynGraphQLClient, pub graphql_client: DynGraphQLClient,
} }
impl EnvVariable { impl EnvVariable {
/// The environment variable name. /// The environment variable name.
pub async fn name(&self) -> Result<String, DaggerError> { pub async fn name(&self) -> eyre::Result<String> {
let query = self.selection.select("name"); let query = self.selection.select("name");
query.execute(self.graphql_client.clone()).await query.execute(self.graphql_client.clone()).await
} }
/// The environment variable value. /// The environment variable value.
pub async fn value(&self) -> Result<String, DaggerError> { pub async fn value(&self) -> eyre::Result<String> {
let query = self.selection.select("value"); let query = self.selection.select("value");
query.execute(self.graphql_client.clone()).await query.execute(self.graphql_client.clone()).await
@ -2260,14 +1998,14 @@ impl EnvVariable {
} }
#[derive(Clone)] #[derive(Clone)]
pub struct File { pub struct File {
pub proc: Option<Arc<Child>>, pub proc: Arc<Child>,
pub selection: Selection, pub selection: Selection,
pub graphql_client: DynGraphQLClient, pub graphql_client: DynGraphQLClient,
} }
impl File { impl File {
/// Retrieves the contents of the file. /// Retrieves the contents of the file.
pub async fn contents(&self) -> Result<String, DaggerError> { pub async fn contents(&self) -> eyre::Result<String> {
let query = self.selection.select("contents"); let query = self.selection.select("contents");
query.execute(self.graphql_client.clone()).await query.execute(self.graphql_client.clone()).await
@ -2277,7 +2015,7 @@ impl File {
/// # Arguments /// # Arguments
/// ///
/// * `path` - Location of the written directory (e.g., "output.txt"). /// * `path` - Location of the written directory (e.g., "output.txt").
pub async fn export(&self, path: impl Into<String>) -> Result<bool, DaggerError> { pub async fn export(&self, path: impl Into<String>) -> eyre::Result<bool> {
let mut query = self.selection.select("export"); let mut query = self.selection.select("export");
query = query.arg("path", path.into()); query = query.arg("path", path.into());
@ -2285,7 +2023,7 @@ impl File {
query.execute(self.graphql_client.clone()).await query.execute(self.graphql_client.clone()).await
} }
/// Retrieves the content-addressed identifier of the file. /// Retrieves the content-addressed identifier of the file.
pub async fn id(&self) -> Result<FileId, DaggerError> { pub async fn id(&self) -> eyre::Result<FileId> {
let query = self.selection.select("id"); let query = self.selection.select("id");
query.execute(self.graphql_client.clone()).await query.execute(self.graphql_client.clone()).await
@ -2301,7 +2039,7 @@ impl File {
}; };
} }
/// Gets the size of the file, in bytes. /// Gets the size of the file, in bytes.
pub async fn size(&self) -> Result<isize, DaggerError> { pub async fn size(&self) -> eyre::Result<isize> {
let query = self.selection.select("size"); let query = self.selection.select("size");
query.execute(self.graphql_client.clone()).await query.execute(self.graphql_client.clone()).await
@ -2327,7 +2065,7 @@ impl File {
} }
#[derive(Clone)] #[derive(Clone)]
pub struct GitRef { pub struct GitRef {
pub proc: Option<Arc<Child>>, pub proc: Arc<Child>,
pub selection: Selection, pub selection: Selection,
pub graphql_client: DynGraphQLClient, pub graphql_client: DynGraphQLClient,
} }
@ -2342,7 +2080,7 @@ pub struct GitRefTreeOpts<'a> {
impl GitRef { impl GitRef {
/// The digest of the current value of this ref. /// The digest of the current value of this ref.
pub async fn digest(&self) -> Result<String, DaggerError> { pub async fn digest(&self) -> eyre::Result<String> {
let query = self.selection.select("digest"); let query = self.selection.select("digest");
query.execute(self.graphql_client.clone()).await query.execute(self.graphql_client.clone()).await
@ -2386,7 +2124,7 @@ impl GitRef {
} }
#[derive(Clone)] #[derive(Clone)]
pub struct GitRepository { pub struct GitRepository {
pub proc: Option<Arc<Child>>, pub proc: Arc<Child>,
pub selection: Selection, pub selection: Selection,
pub graphql_client: DynGraphQLClient, pub graphql_client: DynGraphQLClient,
} }
@ -2409,7 +2147,7 @@ impl GitRepository {
}; };
} }
/// Lists of branches on the repository. /// Lists of branches on the repository.
pub async fn branches(&self) -> Result<Vec<String>, DaggerError> { pub async fn branches(&self) -> eyre::Result<Vec<String>> {
let query = self.selection.select("branches"); let query = self.selection.select("branches");
query.execute(self.graphql_client.clone()).await query.execute(self.graphql_client.clone()).await
@ -2447,7 +2185,7 @@ impl GitRepository {
}; };
} }
/// Lists of tags on the repository. /// Lists of tags on the repository.
pub async fn tags(&self) -> Result<Vec<String>, DaggerError> { pub async fn tags(&self) -> eyre::Result<Vec<String>> {
let query = self.selection.select("tags"); let query = self.selection.select("tags");
query.execute(self.graphql_client.clone()).await query.execute(self.graphql_client.clone()).await
@ -2455,7 +2193,7 @@ impl GitRepository {
} }
#[derive(Clone)] #[derive(Clone)]
pub struct Host { pub struct Host {
pub proc: Option<Arc<Child>>, pub proc: Arc<Child>,
pub selection: Selection, pub selection: Selection,
pub graphql_client: DynGraphQLClient, pub graphql_client: DynGraphQLClient,
} }
@ -2596,7 +2334,7 @@ impl Host {
} }
#[derive(Clone)] #[derive(Clone)]
pub struct HostVariable { pub struct HostVariable {
pub proc: Option<Arc<Child>>, pub proc: Arc<Child>,
pub selection: Selection, pub selection: Selection,
pub graphql_client: DynGraphQLClient, pub graphql_client: DynGraphQLClient,
} }
@ -2613,7 +2351,7 @@ impl HostVariable {
}; };
} }
/// The value of this variable. /// The value of this variable.
pub async fn value(&self) -> Result<String, DaggerError> { pub async fn value(&self) -> eyre::Result<String> {
let query = self.selection.select("value"); let query = self.selection.select("value");
query.execute(self.graphql_client.clone()).await query.execute(self.graphql_client.clone()).await
@ -2621,20 +2359,20 @@ impl HostVariable {
} }
#[derive(Clone)] #[derive(Clone)]
pub struct Label { pub struct Label {
pub proc: Option<Arc<Child>>, pub proc: Arc<Child>,
pub selection: Selection, pub selection: Selection,
pub graphql_client: DynGraphQLClient, pub graphql_client: DynGraphQLClient,
} }
impl Label { impl Label {
/// The label name. /// The label name.
pub async fn name(&self) -> Result<String, DaggerError> { pub async fn name(&self) -> eyre::Result<String> {
let query = self.selection.select("name"); let query = self.selection.select("name");
query.execute(self.graphql_client.clone()).await query.execute(self.graphql_client.clone()).await
} }
/// The label value. /// The label value.
pub async fn value(&self) -> Result<String, DaggerError> { pub async fn value(&self) -> eyre::Result<String> {
let query = self.selection.select("value"); let query = self.selection.select("value");
query.execute(self.graphql_client.clone()).await query.execute(self.graphql_client.clone()).await
@ -2642,26 +2380,26 @@ impl Label {
} }
#[derive(Clone)] #[derive(Clone)]
pub struct Port { pub struct Port {
pub proc: Option<Arc<Child>>, pub proc: Arc<Child>,
pub selection: Selection, pub selection: Selection,
pub graphql_client: DynGraphQLClient, pub graphql_client: DynGraphQLClient,
} }
impl Port { impl Port {
/// The port description. /// The port description.
pub async fn description(&self) -> Result<String, DaggerError> { pub async fn description(&self) -> eyre::Result<String> {
let query = self.selection.select("description"); let query = self.selection.select("description");
query.execute(self.graphql_client.clone()).await query.execute(self.graphql_client.clone()).await
} }
/// The port number. /// The port number.
pub async fn port(&self) -> Result<isize, DaggerError> { pub async fn port(&self) -> eyre::Result<isize> {
let query = self.selection.select("port"); let query = self.selection.select("port");
query.execute(self.graphql_client.clone()).await query.execute(self.graphql_client.clone()).await
} }
/// The transport layer network protocol. /// The transport layer network protocol.
pub async fn protocol(&self) -> Result<NetworkProtocol, DaggerError> { pub async fn protocol(&self) -> eyre::Result<NetworkProtocol> {
let query = self.selection.select("protocol"); let query = self.selection.select("protocol");
query.execute(self.graphql_client.clone()).await query.execute(self.graphql_client.clone()).await
@ -2669,7 +2407,7 @@ impl Port {
} }
#[derive(Clone)] #[derive(Clone)]
pub struct Project { pub struct Project {
pub proc: Option<Arc<Child>>, pub proc: Arc<Child>,
pub selection: Selection, pub selection: Selection,
pub graphql_client: DynGraphQLClient, pub graphql_client: DynGraphQLClient,
} }
@ -2696,25 +2434,25 @@ impl Project {
}; };
} }
/// install the project's schema /// install the project's schema
pub async fn install(&self) -> Result<bool, DaggerError> { pub async fn install(&self) -> eyre::Result<bool> {
let query = self.selection.select("install"); let query = self.selection.select("install");
query.execute(self.graphql_client.clone()).await query.execute(self.graphql_client.clone()).await
} }
/// name of the project /// name of the project
pub async fn name(&self) -> Result<String, DaggerError> { pub async fn name(&self) -> eyre::Result<String> {
let query = self.selection.select("name"); let query = self.selection.select("name");
query.execute(self.graphql_client.clone()).await query.execute(self.graphql_client.clone()).await
} }
/// schema provided by the project /// schema provided by the project
pub async fn schema(&self) -> Result<String, DaggerError> { pub async fn schema(&self) -> eyre::Result<String> {
let query = self.selection.select("schema"); let query = self.selection.select("schema");
query.execute(self.graphql_client.clone()).await query.execute(self.graphql_client.clone()).await
} }
/// sdk used to generate code for and/or execute this project /// sdk used to generate code for and/or execute this project
pub async fn sdk(&self) -> Result<String, DaggerError> { pub async fn sdk(&self) -> eyre::Result<String> {
let query = self.selection.select("sdk"); let query = self.selection.select("sdk");
query.execute(self.graphql_client.clone()).await query.execute(self.graphql_client.clone()).await
@ -2722,7 +2460,7 @@ impl Project {
} }
#[derive(Clone)] #[derive(Clone)]
pub struct Query { pub struct Query {
pub proc: Option<Arc<Child>>, pub proc: Arc<Child>,
pub selection: Selection, pub selection: Selection,
pub graphql_client: DynGraphQLClient, pub graphql_client: DynGraphQLClient,
} }
@ -2829,7 +2567,7 @@ impl Query {
}; };
} }
/// The default platform of the builder. /// The default platform of the builder.
pub async fn default_platform(&self) -> Result<Platform, DaggerError> { pub async fn default_platform(&self) -> eyre::Result<Platform> {
let query = self.selection.select("defaultPlatform"); let query = self.selection.select("defaultPlatform");
query.execute(self.graphql_client.clone()).await query.execute(self.graphql_client.clone()).await
@ -3091,20 +2829,20 @@ impl Query {
} }
#[derive(Clone)] #[derive(Clone)]
pub struct Secret { pub struct Secret {
pub proc: Option<Arc<Child>>, pub proc: Arc<Child>,
pub selection: Selection, pub selection: Selection,
pub graphql_client: DynGraphQLClient, pub graphql_client: DynGraphQLClient,
} }
impl Secret { impl Secret {
/// The identifier for this secret. /// The identifier for this secret.
pub async fn id(&self) -> Result<SecretId, DaggerError> { pub async fn id(&self) -> eyre::Result<SecretId> {
let query = self.selection.select("id"); let query = self.selection.select("id");
query.execute(self.graphql_client.clone()).await query.execute(self.graphql_client.clone()).await
} }
/// The value of this secret. /// The value of this secret.
pub async fn plaintext(&self) -> Result<String, DaggerError> { pub async fn plaintext(&self) -> eyre::Result<String> {
let query = self.selection.select("plaintext"); let query = self.selection.select("plaintext");
query.execute(self.graphql_client.clone()).await query.execute(self.graphql_client.clone()).await
@ -3112,14 +2850,14 @@ impl Secret {
} }
#[derive(Clone)] #[derive(Clone)]
pub struct Socket { pub struct Socket {
pub proc: Option<Arc<Child>>, pub proc: Arc<Child>,
pub selection: Selection, pub selection: Selection,
pub graphql_client: DynGraphQLClient, pub graphql_client: DynGraphQLClient,
} }
impl Socket { impl Socket {
/// The content-addressed identifier of the socket. /// The content-addressed identifier of the socket.
pub async fn id(&self) -> Result<SocketId, DaggerError> { pub async fn id(&self) -> eyre::Result<SocketId> {
let query = self.selection.select("id"); let query = self.selection.select("id");
query.execute(self.graphql_client.clone()).await query.execute(self.graphql_client.clone()).await

View File

@ -1,7 +1,6 @@
#![deny(warnings)] #![deny(warnings)]
mod client; mod client;
pub mod errors;
mod gen; mod gen;
pub mod logging; pub mod logging;
mod querybuilder; mod querybuilder;

View File

@ -1,10 +1,9 @@
use std::{collections::HashMap, ops::Add, sync::Arc}; use std::{collections::HashMap, ops::Add, sync::Arc};
use dagger_core::graphql_client::DynGraphQLClient; use dagger_core::graphql_client::DynGraphQLClient;
use eyre::Context;
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use crate::errors::{DaggerError, DaggerUnpackError};
pub fn query() -> Selection { pub fn query() -> Selection {
Selection::default() Selection::default()
} }
@ -93,7 +92,7 @@ impl Selection {
s s
} }
pub fn build(&self) -> Result<String, DaggerError> { pub fn build(&self) -> eyre::Result<String> {
let mut fields = vec!["query".to_string()]; let mut fields = vec!["query".to_string()];
for sel in self.path() { for sel in self.path() {
@ -118,7 +117,7 @@ impl Selection {
Ok(fields.join("{") + &"}".repeat(fields.len() - 1)) Ok(fields.join("{") + &"}".repeat(fields.len() - 1))
} }
pub async fn execute<D>(&self, gql_client: DynGraphQLClient) -> Result<D, DaggerError> pub async fn execute<D>(&self, gql_client: DynGraphQLClient) -> eyre::Result<D>
where where
D: for<'de> Deserialize<'de>, D: for<'de> Deserialize<'de>,
{ {
@ -128,7 +127,7 @@ impl Selection {
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) => return Err(DaggerError::Query(e)), Err(e) => eyre::bail!(e),
}; };
let resp: Option<D> = self.unpack_resp(resp)?; let resp: Option<D> = self.unpack_resp(resp)?;
@ -152,10 +151,7 @@ impl Selection {
selections selections
} }
pub(crate) fn unpack_resp<D>( pub(crate) fn unpack_resp<D>(&self, resp: Option<serde_json::Value>) -> eyre::Result<Option<D>>
&self,
resp: Option<serde_json::Value>,
) -> Result<Option<D>, DaggerError>
where where
D: for<'de> Deserialize<'de>, D: for<'de> Deserialize<'de>,
{ {
@ -165,23 +161,21 @@ impl Selection {
} }
} }
fn unpack_resp_value<D>(&self, r: serde_json::Value) -> Result<D, DaggerError> fn unpack_resp_value<D>(&self, r: serde_json::Value) -> eyre::Result<D>
where where
D: for<'de> Deserialize<'de>, D: for<'de> Deserialize<'de>,
{ {
if let Some(o) = r.as_object() { if let Some(o) = r.as_object() {
let keys = o.keys(); let keys = o.keys();
if keys.len() != 1 { if keys.len() != 1 {
return Err(DaggerError::Unpack(DaggerUnpackError::TooManyNestedObjects)); eyre::bail!("too many nested objects inside graphql response")
} }
let first = keys.into_iter().next().unwrap(); let first = keys.into_iter().next().unwrap();
return self.unpack_resp_value(o.get(first).unwrap().clone()); return self.unpack_resp_value(o.get(first).unwrap().clone());
} }
serde_json::from_value::<D>(r) serde_json::from_value::<D>(r).context("could not deserialize response")
.map_err(DaggerUnpackError::Deserialize)
.map_err(DaggerError::Unpack)
} }
} }

View File

@ -111,9 +111,9 @@ async fn test_err_message() {
assert_eq!(alpine.is_err(), true); assert_eq!(alpine.is_err(), true);
let err = alpine.expect_err("Tests expect err"); let err = alpine.expect_err("Tests expect err");
let error_msg = r#"failed to query dagger engine: domain error: let error_msg = r#"
Look at json field for more details GQLClient Error: Look at json field for more details
pull access denied, repository does not exist or may require authorization: server message: insufficient_scope: authorization failed Message: pull access denied, repository does not exist or may require authorization: server message: insufficient_scope: authorization failed
"#; "#;
assert_eq!(err.to_string().as_str(), error_msg); assert_eq!(err.to_string().as_str(), error_msg);