Add support for cargo workspaces
This change adds support for cargo workspaces, both virtual workspaces and ones with top-level packages. It does so by caching the paths to the workspace members as the workspaces are discovered by "primary" discovery mechanisms (like a recursive crawl) and then specifically loads packages from those directories after the primary discovery extensions have completed.
Note that all of the packages in a workspace are discovered regardless of the "default-members" value in the workspace configuration.
When inspecting the output from cargo metadata and when invoking other cargo commands like build, test, and fmt, we should specify the name of the package we're operating on.
When a package is part of a cargo workspace, these operations will normally encompass the whole workspace but colcon operates on a per-package basis, so we need to limit the scope to the specific package we're working with.
A subtle change in behavior introduced by this change is that any packages in subdirectories of a workspace which are not listed as a workspace member will not be discovered. The presence of a valid workspace configuration, while not strictly a package itself, should serve as a declaration of what packages live in subdirectories of said workspace and colcon should respect that.
Codecov Report
Attention: Patch coverage is 84.21053% with 12 lines in your changes missing coverage. Please review.
Project coverage is 72.22%. Comparing base (
c01fa0b) to head (4e17d89).
Additional details and impacted files
@@ Coverage Diff @@
## main #59 +/- ##
==========================================
+ Coverage 69.42% 72.22% +2.79%
==========================================
Files 7 9 +2
Lines 278 342 +64
Branches 50 54 +4
==========================================
+ Hits 193 247 +54
- Misses 56 61 +5
- Partials 29 34 +5
:umbrella: View full report in Codecov by Sentry.
:loudspeaker: Have feedback on the report? Share it here.
:rocket: New features to boost your workflow:
- :snowflake: Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
I attempted to do some debugging to figure out why nothing is being discovered for me anymore. It's not only the ros2-rust workspace that no longer works.., none of my colcon workspaces can discover packages anymore.
I've pushed a branch grey/debug_workspaces with the debug outputs. I install that and then run colcon graph on various colcon workspaces to see what happens in the discovery mechanism.
I'm noticing the following:
-
CargoPackageIdentification.identifyis never getting called. I suspect none of the other identification plugins are being triggered either. -
CargoWorkspacePackageDiscovery.discoveris getting called but it has no paths sinceCargoPackageIdentification.identifynever gets called, so nothing happens here.
My impression is that CargoWorkspacePackageDiscovery has completely replaced the usual colcon package discovery extension instead of working alongside it. Everything goes back to normal when I revert to the main branch.
Thanks for digging in. I think I spotted the problem. In all of my local testing, I was specifying either --paths or --base-path, so this code segment is behaving differently: https://github.com/colcon/colcon-core/blob/a74fa97fcea08d1e276a327228c119ce78aa0075/colcon_core/package_discovery/init.py#L180-L185
I'll need to take a closer look at how we might do this. Converting to draft.
Alright, I didn't find an acceptable way to trick the package discovery plumbing into the behavior we want, so I've proposed a subtle update to the PackageDiscoveryExtensionPoint API to support this use case: colcon/colcon-core#685
Okay, pretty cool, so this is a "bring your own cargo workspace" approach?
What is the expected behavior of a workspace setup like this
.
└── colcon_ws/
├── Cargo.toml
├── lib.rs
└── bar/
├── Cargo.toml
└── lib.rs
Where colcon_ws/Cargo.toml has these contents
[workspace]
members = ["bar"]
[package]
name = "foo"
[dependencies]
bar = { path = "bar" }
# ...
This approach would discover two ROS 2 packages, foo and bar?
Additionally, would this approach support multiple Cargo workspaces in a single colcon workspace?
└── colcon_ws/
└── src/
├── cargo_ws_1/
│ ├── Cargo.toml
│ └── foo/
│ └── Cargo.toml
└── cargo_ws_2/
├── Cargo.toml
└── bar/
└── Cargo.toml
What is the expected behavior of a workspace setup like this...
$ colcon graph
bar +*
foo +
This approach would discover two ROS 2 packages,
fooandbar?
It discovers both cargo packages, these are not ROS 2 packages. They have no package.xml.
Additionally, would this approach support multiple Cargo workspaces in a single colcon workspace?
This change is all about package discovery and identification. In order for colcon to connect dependencies, it needs to find the packages first. The current behavior is to ignore a Cargo.toml that defines a workspace, which actually allows the recursive directory traversal to continue into subdirectories possibly discovering some or all of the "members" of the workspace. Of note, this would miss a top-level package for the cargo workspace and would also possibly discover packages in subdirectories which aren't part of the workspace. This change addresses both of those deficits.
When colcon invokes cargo to build these workspace members, it seems to walk up the directory tree to determine if the package is part of a workspace, so when colcon builds the individual packages in the workspace, they still "respect" the cargo workspace and any configurations defined for it. This is exactly what we want - to use cargo as a "build system" but perform the orchestration in colcon, which acts as the "build tool."
In short, yes, this will support any number of Cargo workspaces within a single colcon workspace, and will draw dependencies among all of the individual package members. I can't say that I believe it's a good idea, but it would even allow a circular dependency among the workspaces (though not among the packages themselves).
Alright the upstream changes to colcon-core are shipped, so this is ready for more testing again.
@cottsay , I wasn't able to get the head of this branch to work. Perhaps I'm missing somthing?
FROM rust:1.85.1-bookworm
# Clone example workspace
WORKDIR /ws/src/example
RUN git clone https://github.com/Enet4/dicom-rs.git .
# Build via cargo
# RUN cargo build
# Install colcon-cargo
RUN --mount=type=cache,sharing=locked,target=/var/cache/apt \
apt-get update && apt-get install -y --no-install-recommends \
python3-pip
RUN --mount=type=cache,sharing=locked,target=/root/.cache/pip \
pip3 install --break-system-packages \
git+https://github.com/colcon/[email protected] \
git+https://github.com/colcon/colcon-cargo.git@48d0118
# Build via colcon
WORKDIR /ws
RUN colcon build && \
colcon test
$ docker build --tag=colcon:cargo --progress=plain .
...
#10 [stage-0 7/7] RUN colcon build && colcon test
#10 DONE 0.7s
...
From above, we can see colcon performing a no-op as compared to just RUN cargo build.
Thanks for taking a look, @ruffsl. Your container is missing colcon-recursive-crawl and the sources are cloned into a subdirectory of src. After adding that to the list of packages to install, colcon sees many packages in that repository:
dicom-core + *****.***.*******
dicom-dictionary-builder +
dicom-dictionary-std +**.*****.*******
dicom-encoding +****..*.***.*.*
dicom-parser + * ... ....*..
dicom-transfer-syntax-registry +**..*.***.***
dicom-object + *** *******
dicom-ul + ** * ***
dicom-fromimage +
dicom-json + * ...
dicom-pixeldata + ***
dicom-scpproxy +
dicom-storescp +
dicom-dump + ***
dicom-storescu +
dicom-toimage +
dicom +
dicom-echoscu +
dicom-findscu +
...and performs a build as expected.
Your container is missing
colcon-recursive-crawl
Should that python module then be included in the list of install_requires dependencies?
https://github.com/colcon/colcon-cargo/blob/48d01185d73f809b44d23532b61082f2ef06055c/setup.cfg#L26-L29
Or I suppose not, given we can still cargo build without it - by invoking colcon inside src dirs.
Although the print out to stdout seems a quite a bit noisy here. Is this expected?
#10 440.5 Finished <<< dicom-echoscu [30.1s]
#10 440.5 Starting >>> dicom-findscu
#10 440.5 {"packages":[{"name":"dicom-core","version":"0.8.1","id":"path+file:///ws/src/example/core#[email protected]","license":"MIT OR Apache-2.0","license_file":null,"description":"Efficient and practical core library for DICOM compliant systems","source":null,"dependencies":[{"name":"chrono","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^0.4.31","kind":null,"rename":null,"optional":false,"uses_default_features":false,"features":["std","clock"],"target":null,"registry":null},{"name":"itertools","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^0.13","kind":null,"rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null},{"name":"num-traits","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^0.2.12","kind":null,"rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null},{"name":"safe-transmute","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^0.11.0","kind":null,"rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null},{"name":"smallvec","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^1.6.1","kind":null,"rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null},{"name":"snafu","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^0.8","kind":null,"rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null}],"targets":[{"kind":["lib"],"crate_types":["lib"],"name":"dicom_core","src_path":"/ws/src/example/core/src/lib.rs","edition":"2018","doc":true,"doctest":true,"test":true},{"kind":["test"],"crate_types":["bin"],"name":"dicom_value","src_path":"/ws/src/example/core/tests/dicom_value.rs","edition":"2018","doc":false,"doctest":false,"test":true},{"kind":["test"],"crate_types":["bin"],"name":"using_prelude","src_path":"/ws/src/example/core/tests/using_prelude.rs","edition":"2018","doc":false,"doctest":false,"test":true}],"features":{},"manifest_path":"/ws/src/example/core/Cargo.toml","metadata":null,"publish":null,"authors":["Eduardo Pinho <[email protected]>"],"categories":[],"keywords":["dicom"],"readme":"README.md","repository":"https://github.com/Enet4/dicom-rs","homepage":null,"documentation":null,"edition":"2018","links":null,"default_run":null,"rust_version":"1.72.0"},{"name":"dicom-encoding","version":"0.8.1","id":"path+file:///ws/src/example/encoding#[email protected]","license":"MIT OR Apache-2.0","license_file":null,"description":"DICOM encoding and decoding primitives","source":null,"dependencies":[{"name":"byteordered","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^0.6","kind":null,"rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null},{"name":"dicom-core","source":null,"req":"^0.8.1","kind":null,"rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null,"path":"/ws/src/example/core"},{"name":"dicom-dictionary-std","source":null,"req":"^0.8.0","kind":null,"rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null,"path":"/ws/src/example/dictionary-std"},{"name":"encoding","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^0.2.33","kind":null,"rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null},{"name":"inventory","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^0.3.2","kind":null,"rename":null,"optional":true,"uses_default_features":true,"features":[],"target":null,"registry":null},{"name":"snafu","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^0.8","kind":null,"rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null}],"targets":[{"kind":["lib"],"crate_types":["lib"],"name":"dicom_encoding","src_path":"/ws/src/example/encoding/src/lib.rs","edition":"2018","doc":true,"doctest":true,"test":true}],"features":{"default":[],"inventory":["dep:inventory"],"inventory-registry":["inventory"]},"manifest_path":"/ws/src/example/encoding/Cargo.toml","metadata":null,"publish":null,"authors":["Eduardo Pinho <[email protected]>"],"categories":["encoding"],"keywords":["dicom"],"readme":"README.md","repository":"https://github.com/Enet4/dicom-rs","homepage":null,"documentation":null,"edition":"2018","links":null,"default_run":null,"rust_version":"1.72.0"},{"name":"dicom-dictionary-std","version":"0.8.0","id":"path+file:///ws/src/example/dictionary-std#[email protected]","license":"MIT OR Apache-2.0","license_file":null,"description":"Standard DICOM attribute dictionary","source":null,"dependencies":[{"name":"dicom-core","source":null,"req":"^0.8.1","kind":null,"rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null,"path":"/ws/src/example/core"},{"name":"once_cell","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^1.18.0","kind":null,"rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null}],"targets":[{"kind":["lib"],"crate_types":["lib"],"name":"dicom_dictionary_std","src_path":"/ws/src/example/dictionary-std/src/lib.rs","edition":"2018","doc":true,"doctest":true,"test":true}],"features":{"application-context-name":[],"application-hosting-model":[],"coding-scheme":[],"default":[],"dicom-uid-as-coding-scheme":[],"ldap-oid":[],"mapping-resource":[],"meta-sop-class":[],"service-class":[],"sop-class":[],"synchronization-frame-of-reference":[],"transfer-syntax":[],"well-known-sop-instance":[]},"manifest_path":"/ws/src/example/dictionary-std/Cargo.toml","metadata":null,"publish":null,"authors":["Eduardo Pinho <[email protected]>"],"categories":[],"keywords":["dicom","dictionary"],"readme":"README.md","repository":"https://github.com/Enet4/dicom-rs","homepage":null,"documentation":null,"edition":"2018","links":null,"default_run":null,"rust_version":"1.72.0"},{"name":"dicom-parser","version":"0.8.1","id":"path+file:///ws/src/example/parser#[email protected]","license":"MIT OR Apache-2.0","license_file":null,"description":"A middle-level parser and printer of DICOM data sets","source":null,"dependencies":[{"name":"dicom-core","source":null,"req":"^0.8.1","kind":null,"rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null,"path":"/ws/src/example/core"},{"name":"dicom-dictionary-std","source":null,"req":"^0.8.0","kind":null,"rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null,"path":"/ws/src/example/dictionary-std"},{"name":"dicom-encoding","source":null,"req":"^0.8.1","kind":null,"rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null,"path":"/ws/src/example/encoding"},{"name":"smallvec","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^1.6.1","kind":null,"rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null},{"name":"snafu","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^0.8","kind":null,"rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null},{"name":"tracing","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^0.1.34","kind":null,"rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null}],"targets":[{"kind":["lib"],"crate_types":["lib"],"name":"dicom_parser","src_path":"/ws/src/example/parser/src/lib.rs","edition":"2018","doc":true,"doctest":true,"test":true}],"features":{},"manifest_path":"/ws/src/example/parser/Cargo.toml","metadata":null,"publish":null,"authors":["Eduardo Pinho <[email protected]>"],"categories":["parser-implementations"],"keywords":["dicom","parser"],"readme":"README.md","repository":"https://github.com/Enet4/dicom-rs","homepage":null,"documentation":null,"edition":"2018","links":null,"default_run":null,"rust_version":"1.72.0"},{"name":"dicom-transfer-syntax-registry","version":"0.8.1","id":"path+file:///ws/src/example/transfer-syntax-registry#[email protected]","license":"MIT OR Apache-2.0","license_file":null,"description":"A registry of DICOM transfer syntaxes","source":null,"dependencies":[{"name":"byteordered","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^0.6","kind":null,"rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null},{"name":"charls","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^0.3","kind":null,"rename":null,"optional":true,"uses_default_features":true,"features":["static"],"target":null,"registry":null},{"name":"dicom-core","source":null,"req":"^0.8.1","kind":null,"rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null,"path":"/ws/src/example/core"},{"name":"dicom-encoding","source":null,"req":"^0.8.1","kind":null,"rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null,"path":"/ws/src/example/encoding"},{"name":"jpeg-decoder","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^0.3.0","kind":null,"rename":null,"optional":true,"uses_default_features":true,"features":[],"target":null,"registry":null},{"name":"jpeg-encoder","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^0.6","kind":null,"rename":null,"optional":true,"uses_default_features":true,"features":[],"target":null,"registry":null},{"name":"jpeg2k","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^0.9.1","kind":null,"rename":null,"optional":true,"uses_default_features":false,"features":[],"target":null,"registry":null},{"name":"jxl-oxide","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^0.10.2","kind":null,"rename":null,"optional":true,"uses_default_features":true,"features":[],"target":null,"registry":null},{"name":"lazy_static","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^1.2.0","kind":null,"rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null},{"name":"tracing","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^0.1.34","kind":null,"rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null},{"name":"zune-core","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^0.4.12","kind":null,"rename":null,"optional":true,"uses_default_features":false,"features":[],"target":null,"registry":null},{"name":"zune-jpegxl","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^0.4.0","kind":null,"rename":null,"optional":true,"uses_default_features":false,"features":["std"],"target":null,"registry":null},{"name":"dicom-test-files","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^0.3","kind":"dev","rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null}],"targets":[{"kind":["lib"],"crate_types":["lib"],"name":"dicom_transfer_syntax_registry","src_path":"/ws/src/example/transfer-syntax-registry/src/lib.rs","edition":"2018","doc":true,"doctest":true,"test":true},{"kind":["test"],"crate_types":["bin"],"name":"base","src_path":"/ws/src/example/transfer-syntax-registry/tests/base.rs","edition":"2018","doc":false,"doctest":false,"test":true},{"kind":["test"],"crate_types":["bin"],"name":"jpeg","src_path":"/ws/src/example/transfer-syntax-registry/tests/jpeg.rs","edition":"2018","doc":false,"doctest":false,"test":true},{"kind":["test"],"crate_types":["bin"],"name":"jpegls","src_path":"/ws/src/example/transfer-syntax-registry/tests/jpegls.rs","edition":"2018","doc":false,"doctest":false,"test":true},{"kind":["test"],"crate_types":["bin"],"name":"jpegxl","src_path":"/ws/src/example/transfer-syntax-registry/tests/jpegxl.rs","edition":"2018","doc":false,"doctest":false,"test":true},{"kind":["test"],"crate_types":["bin"],"name":"rle","src_path":"/ws/src/example/transfer-syntax-registry/tests/rle.rs","edition":"2018","doc":false,"doctest":false,"test":true},{"kind":["test"],"crate_types":["bin"],"name":"submit_dataset","src_path":"/ws/src/example/transfer-syntax-registry/tests/submit_dataset.rs","edition":"2018","doc":false,"doctest":false,"test":true},{"kind":["test"],"crate_types":["bin"],"name":"submit_pixel","src_path":"/ws/src/example/transfer-syntax-registry/tests/submit_pixel.rs","edition":"2018","doc":false,"doctest":false,"test":true},{"kind":["test"],"crate_types":["bin"],"name":"submit_pixel_stub","src_path":"/ws/src/example/transfer-syntax-registry/tests/submit_pixel_stub.rs","edition":"2018","doc":false,"doctest":false,"test":true},{"kind":["test"],"crate_types":["bin"],"name":"submit_replace","src_path":"/ws/src/example/transfer-syntax-registry/tests/submit_replace.rs","edition":"2018","doc":false,"doctest":false,"test":true},{"kind":["test"],"crate_types":["bin"],"name":"submit_replace_precondition","src_path":"/ws/src/example/transfer-syntax-registry/tests/submit_replace_precondition.rs","edition":"2018","doc":false,"doctest":false,"test":true}],"features":{"charls":["dep:charls"],"default":["rayon","simd"],"inventory-registry":["dicom-encoding/inventory-registry"],"jpeg":["jpeg-decoder","jpeg-encoder"],"jpeg-decoder":["dep:jpeg-decoder"],"jpeg-encoder":["dep:jpeg-encoder"],"jpegxl":["dep:jxl-oxide","dep:zune-jpegxl","dep:zune-core"],"native":["jpeg","rle"],"native_windows":["jpeg","rle"],"openjp2":["dep:jpeg2k","jpeg2k/openjp2"],"openjpeg-sys":["dep:jpeg2k","jpeg2k/openjpeg-sys"],"openjpeg-sys-threads":["rayon","jpeg2k?/threads"],"rayon":["jpeg-decoder?/rayon","jxl-oxide?/rayon"],"rle":[],"simd":["jpeg-encoder?/simd"],"zune-jpegxl-threads":["zune-jpegxl?/threads"]},"manifest_path":"/ws/src/example/transfer-syntax-registry/Cargo.toml","metadata":{"docs":{"rs":{"features":["native"]}}},"publish":null,"authors":["Eduardo Pinho <[email protected]>"],"categories":[],"keywords":["dicom"],"readme":"README.md","repository":"https://github.com/Enet4/dicom-rs","homepage":null,"documentation":null,"edition":"2018","links":null,"default_run":null,"rust_version":"1.72.0"},{"name":"dicom-object","version":"0.8.1","id":"path+file:///ws/src/example/object#[email protected]","license":"MIT OR Apache-2.0","license_file":null,"description":"A high-level API for reading and manipulating DICOM objects","source":null,"dependencies":[{"name":"byteordered","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^0.6","kind":null,"rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null},{"name":"dicom-core","source":null,"req":"^0.8.1","kind":null,"rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null,"path":"/ws/src/example/core"},{"name":"dicom-dictionary-std","source":null,"req":"^0.8.0","kind":null,"rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null,"path":"/ws/src/example/dictionary-std"},{"name":"dicom-encoding","source":null,"req":"^0.8.1","kind":null,"rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null,"path":"/ws/src/example/encoding"},{"name":"dicom-parser","source":null,"req":"^0.8.1","kind":null,"rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null,"path":"/ws/src/example/parser"},{"name":"dicom-transfer-syntax-registry","source":null,"req":"^0.8.1","kind":null,"rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null,"path":"/ws/src/example/transfer-syntax-registry"},{"name":"itertools","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^0.13","kind":null,"rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null},{"name":"smallvec","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^1.6.1","kind":null,"rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null},{"name":"snafu","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^0.8","kind":null,"rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null},{"name":"tracing","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^0.1.34","kind":null,"rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null},{"name":"dicom-test-files","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^0.3","kind":"dev","rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null},{"name":"tempfile","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^3.2.0","kind":"dev","rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null}],"targets":[{"kind":["lib"],"crate_types":["lib"],"name":"dicom_object","src_path":"/ws/src/example/object/src/lib.rs","edition":"2018","doc":true,"doctest":true,"test":true},{"kind":["test"],"crate_types":["bin"],"name":"integration_test","src_path":"/ws/src/example/object/tests/integration_test.rs","edition":"2018","doc":false,"doctest":false,"test":true}],"features":{"default":[],"inventory-registry":["dicom-encoding/inventory-registry","dicom-transfer-syntax-registry/inventory-registry"]},"manifest_path":"/ws/src/example/object/Cargo.toml","metadata":null,"publish":null,"authors":["Eduardo Pinho <[email protected]>"],"categories":[],"keywords":["dicom","object","attributes"],"readme":"README.md","repository":"https://github.com/Enet4/dicom-rs","homepage":null,"documentation":null,"edition":"2018","links":null,"default_run":null,"rust_version":"1.72.0"},{"name":"dicom-dictionary-builder","version":"0.8.1","id":"path+file:///ws/src/example/devtools/dictionary-builder#[email protected]","license":"MIT OR Apache-2.0","license_file":null,"description":"A generator of DICOM dictionaries from standard documentation and other sources","source":null,"dependencies":[{"name":"clap","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^4.0.18","kind":null,"rename":null,"optional":false,"uses_default_features":true,"features":["cargo","derive"],"target":null,"registry":null},{"name":"eyre","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^0.6.12","kind":null,"rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null},{"name":"heck","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^0.5.0","kind":null,"rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null},{"name":"regex","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^1.6.0","kind":null,"rename":null,"optional":false,"uses_default_features":false,"features":["std","perf","unicode-case","unicode-perl"],"target":null,"registry":null},{"name":"serde","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^1.0.55","kind":null,"rename":null,"optional":false,"uses_default_features":true,"features":["derive"],"target":null,"registry":null},{"name":"sxd-document","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^0.3.2","kind":null,"rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null},{"name":"sxd-xpath","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^0.4.2","kind":null,"rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null},{"name":"ureq","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^2.4.0","kind":null,"rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null}],"targets":[{"kind":["bin"],"crate_types":["bin"],"name":"dicom-dictionary-builder","src_path":"/ws/src/example/devtools/dictionary-builder/src/main.rs","edition":"2018","doc":true,"doctest":false,"test":true}],"features":{},"manifest_path":"/ws/src/example/devtools/dictionary-builder/Cargo.toml","metadata":null,"publish":null,"authors":["Eduardo Pinho <[email protected]>"],"categories":["command-line-utilities"],"keywords":["dicom","generator","dictionary"],"readme":"README.md","repository":"https://github.com/Enet4/dicom-rs","homepage":null,"documentation":null,"edition":"2018","links":null,"default_run":null,"rust_version":null},{"name":"dicom-dump","version":"0.8.0","id":"path+file:///ws/src/example/dump#[email protected]","license":"MIT OR Apache-2.0","license_file":null,"description":"A CLI tool for inspecting DICOM files","source":null,"dependencies":[{"name":"clap","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^4.0.18","kind":null,"rename":null,"optional":true,"uses_default_features":true,"features":["derive"],"target":null,"registry":null},{"name":"dicom-core","source":null,"req":"^0.8.1","kind":null,"rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null,"path":"/ws/src/example/core"},{"name":"dicom-dictionary-std","source":null,"req":"^0.8.0","kind":null,"rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null,"path":"/ws/src/example/dictionary-std"},{"name":"dicom-encoding","source":null,"req":"^0.8","kind":null,"rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null,"path":"/ws/src/example/encoding"},{"name":"dicom-json","source":null,"req":"^0.8.1","kind":null,"rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null,"path":"/ws/src/example/json"},{"name":"dicom-object","source":null,"req":"^0.8.1","kind":null,"rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null,"path":"/ws/src/example/object"},{"name":"dicom-transfer-syntax-registry","source":null,"req":"^0.8.1","kind":null,"rename":null,"optional":false,"uses_default_features":false,"features":[],"target":null,"registry":null,"path":"/ws/src/example/transfer-syntax-registry"},{"name":"owo-colors","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^4.0.0-rc.1","kind":null,"rename":null,"optional":false,"uses_default_features":true,"features":["supports-colors"],"target":null,"registry":null},{"name":"serde_json","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^1.0.108","kind":null,"rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null},{"name":"snafu","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^0.8","kind":null,"rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null},{"name":"terminal_size","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^0.4.0","kind":null,"rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null}],"targets":[{"kind":["lib"],"crate_types":["lib"],"name":"dicom_dump","src_path":"/ws/src/example/dump/src/lib.rs","edition":"2018","doc":true,"doctest":true,"test":true},{"kind":["bin"],"crate_types":["bin"],"name":"dicom-dump","src_path":"/ws/src/example/dump/src/main.rs","edition":"2018","required-features":["cli"],"doc":true,"doctest":false,"test":true}],"features":{"clap":["dep:clap"],"cli":["clap","dicom-transfer-syntax-registry/inventory-registry"],"default":["cli","sop-class"],"sop-class":["dicom-dictionary-std/sop-class"]},"manifest_path":"/ws/src/example/dump/Cargo.toml","metadata":null,"publish":null,"authors":["Eduardo Pinho <[email protected]>"],"categories":["command-line-utilities"],"keywords":["cli","dicom","dump"],"readme":"README.md","repository":"https://github.com/Enet4/dicom-rs","homepage":null,"documentation":null,"edition":"2018","links":null,"default_run":null,"rust_version":"1.72.0"},{"name":"dicom-json","version":"0.8.1","id":"path+file:///ws/src/example/json#[email protected]","license":"MIT OR Apache-2.0","license_file":null,"description":"DICOM data serialization to/from JSON","source":null,"dependencies":[{"name":"base64","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^0.22","kind":null,"rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null},{"name":"dicom-core","source":null,"req":"^0.8.1","kind":null,"rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null,"path":"/ws/src/example/core"},{"name":"dicom-dictionary-std","source":null,"req":"^0.8.0","kind":null,"rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null,"path":"/ws/src/example/dictionary-std"},{"name":"dicom-object","source":null,"req":"^0.8.0","kind":null,"rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null,"path":"/ws/src/example/object"},{"name":"num-traits","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^0.2.15","kind":null,"rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null},{"name":"serde","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^1.0.164","kind":null,"rename":null,"optional":false,"uses_default_features":true,"features":["derive"],"target":null,"registry":null},{"name":"serde_json","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^1.0.96","kind":null,"rename":null,"optional":false,"uses_default_features":true,"features":["preserve_order"],"target":null,"registry":null},{"name":"tracing","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^0.1.34","kind":null,"rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null},{"name":"dicom-test-files","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^0.3","kind":"dev","rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null},{"name":"pretty_assertions","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^1.3.0","kind":"dev","rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null}],"targets":[{"kind":["lib"],"crate_types":["lib"],"name":"dicom_json","src_path":"/ws/src/example/json/src/lib.rs","edition":"2021","doc":true,"doctest":true,"test":true}],"features":{},"manifest_path":"/ws/src/example/json/Cargo.toml","metadata":null,"publish":null,"authors":["Eduardo Pinho <[email protected]>"],"categories":[],"keywords":["dicom","attributes","json","serialization"],"readme":"README.md","repository":"https://github.com/Enet4/dicom-rs","homepage":null,"documentation":null,"edition":"2021","links":null,"default_run":null,"rust_version":null},{"name":"dicom-echoscu","version":"0.8.0","id":"path+file:///ws/src/example/echoscu#[email protected]","license":"MIT OR Apache-2.0","license_file":null,"description":"A DICOM C-ECHO command line interface","source":null,"dependencies":[{"name":"clap","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^4.0.18","kind":null,"rename":null,"optional":false,"uses_default_features":true,"features":["derive"],"target":null,"registry":null},{"name":"dicom-core","source":null,"req":"^0.8.1","kind":null,"rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null,"path":"/ws/src/example/core"},{"name":"dicom-dictionary-std","source":null,"req":"^0.8.0","kind":null,"rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null,"path":"/ws/src/example/dictionary-std"},{"name":"dicom-dump","source":null,"req":"^0.8.0","kind":null,"rename":null,"optional":false,"uses_default_features":false,"features":[],"target":null,"registry":null,"path":"/ws/src/example/dump"},{"name":"dicom-object","source":null,"req":"^0.8.1","kind":null,"rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null,"path":"/ws/src/example/object"},{"name":"dicom-transfer-syntax-registry","source":null,"req":"^0.8.1","kind":null,"rename":null,"optional":false,"uses_default_features":false,"features":[],"target":null,"registry":null,"path":"/ws/src/example/transfer-syntax-registry"},{"name":"dicom-ul","source":null,"req":"^0.8.1","kind":null,"rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null,"path":"/ws/src/example/ul"},{"name":"snafu","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^0.8","kind":null,"rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null},{"name":"tracing","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^0.1.34","kind":null,"rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null},{"name":"tracing-subscriber","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^0.3.11","kind":null,"rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null}],"targets":[{"kind":["bin"],"crate_types":["bin"],"name":"dicom-echoscu","src_path":"/ws/src/example/echoscu/src/main.rs","edition":"2018","doc":true,"doctest":false,"test":true}],"features":{},"manifest_path":"/ws/src/example/echoscu/Cargo.toml","metadata":null,"publish":null,"authors":["Eduardo Pinho <[email protected]>"],"categories":["command-line-utilities"],"keywords":["dicom"],"readme":"README.md","repository":"https://github.com/Enet4/dicom-rs","homepage":null,"documentation":null,"edition":"2018","links":null,"default_run":null,"rust_version":null},{"name":"dicom-ul","version":"0.8.1","id":"path+file:///ws/src/example/ul#[email protected]","license":"MIT OR Apache-2.0","license_file":null,"description":"Types and methods for interacting with the DICOM Upper Layer Protocol","source":null,"dependencies":[{"name":"byteordered","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^0.6","kind":null,"rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null},{"name":"bytes","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^1.6","kind":null,"rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null},{"name":"dicom-encoding","source":null,"req":"^0.8.1","kind":null,"rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null,"path":"/ws/src/example/encoding"},{"name":"dicom-transfer-syntax-registry","source":null,"req":"^0.8.1","kind":null,"rename":null,"optional":false,"uses_default_features":false,"features":[],"target":null,"registry":null,"path":"/ws/src/example/transfer-syntax-registry"},{"name":"snafu","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^0.8","kind":null,"rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null},{"name":"tokio","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^1.38","kind":null,"rename":null,"optional":true,"uses_default_features":true,"features":["rt","rt-multi-thread","net","io-util","time"],"target":null,"registry":null},{"name":"tracing","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^0.1.34","kind":null,"rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null},{"name":"dicom-dictionary-std","source":null,"req":"*","kind":"dev","rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null,"path":"/ws/src/example/dictionary-std"},{"name":"matches","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^0.1.8","kind":"dev","rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null},{"name":"rstest","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^0.23.0","kind":"dev","rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null},{"name":"tokio","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^1.38","kind":"dev","rename":null,"optional":false,"uses_default_features":true,"features":["io-util","macros","net","rt","rt-multi-thread"],"target":null,"registry":null}],"targets":[{"kind":["lib"],"crate_types":["lib"],"name":"dicom_ul","src_path":"/ws/src/example/ul/src/lib.rs","edition":"2018","doc":true,"doctest":true,"test":true},{"kind":["test"],"crate_types":["bin"],"name":"association","src_path":"/ws/src/example/ul/tests/association.rs","edition":"2018","doc":false,"doctest":false,"test":true},{"kind":["test"],"crate_types":["bin"],"name":"association_echo","src_path":"/ws/src/example/ul/tests/association_echo.rs","edition":"2018","doc":false,"doctest":false,"test":true},{"kind":["test"],"crate_types":["bin"],"name":"association_promiscuous","src_path":"/ws/src/example/ul/tests/association_promiscuous.rs","edition":"2018","doc":false,"doctest":false,"test":true},{"kind":["test"],"crate_types":["bin"],"name":"association_store","src_path":"/ws/src/example/ul/tests/association_store.rs","edition":"2018","doc":false,"doctest":false,"test":true},{"kind":["test"],"crate_types":["bin"],"name":"association_store_uncompressed","src_path":"/ws/src/example/ul/tests/association_store_uncompressed.rs","edition":"2018","doc":false,"doctest":false,"test":true},{"kind":["test"],"crate_types":["bin"],"name":"pdu","src_path":"/ws/src/example/ul/tests/pdu.rs","edition":"2018","doc":false,"doctest":false,"test":true}],"features":{"async":["dep:tokio"],"default":[]},"manifest_path":"/ws/src/example/ul/Cargo.toml","metadata":null,"publish":null,"authors":["Eduardo Pinho <[email protected]>","Paul Knopf <[email protected]>"],"categories":["network-programming"],"keywords":["dicom","network"],"readme":"README.md","repository":"https://github.com/Enet4/dicom-rs","homepage":null,"documentation":null,"edition":"2018","links":null,"default_run":null,"rust_version":"1.72.0"},{"name":"dicom-findscu","version":"0.8.1","id":"path+file:///ws/src/example/findscu#[email protected]","license":"MIT OR Apache-2.0","license_file":null,"description":"A DICOM C-FIND command line interface","source":null,"dependencies":[{"name":"clap","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^4.0.18","kind":null,"rename":null,"optional":false,"uses_default_features":true,"features":["derive"],"target":null,"registry":null},{"name":"dicom-core","source":null,"req":"^0.8.1","kind":null,"rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null,"path":"/ws/src/example/core"},{"name":"dicom-dictionary-std","source":null,"req":"^0.8.0","kind":null,"rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null,"path":"/ws/src/example/dictionary-std"},{"name":"dicom-dump","source":null,"req":"^0.8.0","kind":null,"rename":null,"optional":false,"uses_default_features":false,"features":[],"target":null,"registry":null,"path":"/ws/src/example/dump"},{"name":"dicom-encoding","source":null,"req":"^0.8.1","kind":null,"rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null,"path":"/ws/src/example/encoding"},{"name":"dicom-object","source":null,"req":"^0.8.1","kind":null,"rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null,"path":"/ws/src/example/object"},{"name":"dicom-transfer-syntax-registry","source":null,"req":"^0.8.1","kind":null,"rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null,"path":"/ws/src/example/transfer-syntax-registry"},{"name":"dicom-ul","source":null,"req":"^0.8.1","kind":null,"rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null,"path":"/ws/src/example/ul"},{"name":"snafu","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^0.8","kind":null,"rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null},{"name":"tracing","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^0.1.36","kind":null,"rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null},{"name":"tracing-subscriber","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^0.3.15","kind":null,"rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null}],"targets":[{"kind":["bin"],"crate_types":["bin"],"name":"dicom-findscu","src_path":"/ws/src/example/findscu/src/main.rs","edition":"2021","doc":true,"doctest":false,"test":true}],"features":{},"manifest_path":"/ws/src/example/findscu/Cargo.toml","metadata":null,"publish":null,"authors":["Eduardo Pinho <[email protected]>"],"categories":["command-line-utilities"],"keywords":["dicom","query","search"],"readme":"README.md","repository":"https://github.com/Enet4/dicom-rs","homepage":null,"documentation":null,"edition":"2021","links":null,"default_run":null,"rust_version":null},{"name":"dicom-fromimage","version":"0.8.0","id":"path+file:///ws/src/example/fromimage#[email protected]","license":"MIT OR Apache-2.0","license_file":null,"description":"A CLI tool for replacing the image content from DICOM files","source":null,"dependencies":[{"name":"clap","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^4.0.18","kind":null,"rename":null,"optional":false,"uses_default_features":true,"features":["derive"],"target":null,"registry":null},{"name":"dicom-core","source":null,"req":"^0.8.1","kind":null,"rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null,"path":"/ws/src/example/core"},{"name":"dicom-dictionary-std","source":null,"req":"^0.8.0","kind":null,"rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null,"path":"/ws/src/example/dictionary-std"},{"name":"dicom-object","source":null,"req":"^0.8.1","kind":null,"rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null,"path":"/ws/src/example/object"},{"name":"image","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^0.25.1","kind":null,"rename":null,"optional":false,"uses_default_features":false,"features":["jpeg","png","pnm","tiff","webp","bmp","rayon","exr"],"target":null,"registry":null},{"name":"snafu","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^0.8","kind":null,"rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null},{"name":"tracing","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^0.1.34","kind":null,"rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null},{"name":"tracing-subscriber","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^0.3.11","kind":null,"rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null}],"targets":[{"kind":["bin"],"crate_types":["bin"],"name":"dicom-fromimage","src_path":"/ws/src/example/fromimage/src/main.rs","edition":"2018","doc":true,"doctest":false,"test":true}],"features":{"default":["dicom-object/inventory-registry"]},"manifest_path":"/ws/src/example/fromimage/Cargo.toml","metadata":null,"publish":null,"authors":["Eduardo Pinho <[email protected]>"],"categories":["command-line-utilities"],"keywords":["cli","dicom","image","image-conversion"],"readme":"README.md","repository":"https://github.com/Enet4/dicom-rs","homepage":null,"documentation":null,"edition":"2018","links":null,"default_run":null,"rust_version":"1.72.0"},{"name":"dicom","version":"0.8.1","id":"path+file:///ws/src/example/parent#[email protected]","license":"MIT OR Apache-2.0","license_file":null,"description":"A pure Rust implementation of the DICOM standard","source":null,"dependencies":[{"name":"dicom-core","source":null,"req":"^0.8.1","kind":null,"rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null,"path":"/ws/src/example/core"},{"name":"dicom-dictionary-std","source":null,"req":"^0.8.0","kind":null,"rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null,"path":"/ws/src/example/dictionary-std"},{"name":"dicom-dump","source":null,"req":"^0.8.0","kind":null,"rename":null,"optional":false,"uses_default_features":false,"features":[],"target":null,"registry":null,"path":"/ws/src/example/dump"},{"name":"dicom-encoding","source":null,"req":"^0.8.1","kind":null,"rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null,"path":"/ws/src/example/encoding"},{"name":"dicom-object","source":null,"req":"^0.8.1","kind":null,"rename":null,"optional":false,"uses_default_features":false,"features":[],"target":null,"registry":null,"path":"/ws/src/example/object"},{"name":"dicom-parser","source":null,"req":"^0.8.1","kind":null,"rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null,"path":"/ws/src/example/parser"},{"name":"dicom-pixeldata","source":null,"req":"^0.8.1","kind":null,"rename":null,"optional":true,"uses_default_features":true,"features":[],"target":null,"registry":null,"path":"/ws/src/example/pixeldata"},{"name":"dicom-transfer-syntax-registry","source":null,"req":"^0.8.1","kind":null,"rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null,"path":"/ws/src/example/transfer-syntax-registry"},{"name":"dicom-ul","source":null,"req":"^0.8.1","kind":null,"rename":null,"optional":true,"uses_default_features":true,"features":[],"target":null,"registry":null,"path":"/ws/src/example/ul"}],"targets":[{"kind":["lib"],"crate_types":["lib"],"name":"dicom","src_path":"/ws/src/example/parent/src/lib.rs","edition":"2018","doc":true,"doctest":true,"test":true}],"features":{"default":["inventory-registry","ul","pixeldata"],"dicom-pixeldata":["dep:dicom-pixeldata"],"dicom-ul":["dep:dicom-ul"],"image":["pixeldata","dicom-pixeldata/image"],"inventory-registry":["dicom-encoding/inventory-registry","dicom-transfer-syntax-registry/inventory-registry"],"ndarray":["pixeldata","dicom-pixeldata/ndarray"],"pixeldata":["dicom-pixeldata"],"ul":["dicom-ul"]},"manifest_path":"/ws/src/example/parent/Cargo.toml","metadata":null,"publish":null,"authors":["Eduardo Pinho <[email protected]>"],"categories":[],"keywords":[],"readme":"README.md","repository":"https://github.com/Enet4/dicom-rs","homepage":null,"documentation":null,"edition":"2018","links":null,"default_run":null,"rust_version":"1.72.0"},{"name":"dicom-pixeldata","version":"0.8.1","id":"path+file:///ws/src/example/pixeldata#[email protected]","license":"MIT OR Apache-2.0","license_file":null,"description":"A high-level API for decoding DICOM objects into images and ndarrays","source":null,"dependencies":[{"name":"byteorder","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^1.4.3","kind":null,"rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null},{"name":"clap","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^4.4.2","kind":null,"rename":null,"optional":true,"uses_default_features":true,"features":["cargo","derive"],"target":null,"registry":null},{"name":"dicom-core","source":null,"req":"^0.8.1","kind":null,"rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null,"path":"/ws/src/example/core"},{"name":"dicom-dictionary-std","source":null,"req":"^0.8.0","kind":null,"rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null,"path":"/ws/src/example/dictionary-std"},{"name":"dicom-encoding","source":null,"req":"^0.8.1","kind":null,"rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null,"path":"/ws/src/example/encoding"},{"name":"dicom-object","source":null,"req":"^0.8.1","kind":null,"rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null,"path":"/ws/src/example/object"},{"name":"dicom-transfer-syntax-registry","source":null,"req":"^0.8.1","kind":null,"rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null,"path":"/ws/src/example/transfer-syntax-registry"},{"name":"gdcm-rs","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^0.6","kind":null,"rename":null,"optional":true,"uses_default_features":true,"features":[],"target":null,"registry":null},{"name":"image","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^0.25.1","kind":null,"rename":null,"optional":true,"uses_default_features":false,"features":["jpeg","png","pnm","tiff","webp","bmp","exr"],"target":null,"registry":null},{"name":"ndarray","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^0.15.1","kind":null,"rename":null,"optional":true,"uses_default_features":true,"features":[],"target":null,"registry":null},{"name":"num-traits","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^0.2.12","kind":null,"rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null},{"name":"rayon","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^1.5.0","kind":null,"rename":null,"optional":true,"uses_default_features":true,"features":[],"target":null,"registry":null},{"name":"snafu","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^0.8","kind":null,"rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null},{"name":"tracing","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^0.1.34","kind":null,"rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null},{"name":"tracing-subscriber","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^0.3.17","kind":null,"rename":null,"optional":true,"uses_default_features":true,"features":[],"target":null,"registry":null},{"name":"dicom-test-files","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^0.3","kind":"dev","rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null},{"name":"rstest","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^0.23","kind":"dev","rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null}],"targets":[{"kind":["lib"],"crate_types":["lib"],"name":"dicom_pixeldata","src_path":"/ws/src/example/pixeldata/src/lib.rs","edition":"2018","doc":true,"doctest":true,"test":true},{"kind":["bin"],"crate_types":["bin"],"name":"dicom-transcode","src_path":"/ws/src/example/pixeldata/src/bin/dicom-transcode.rs","edition":"2018","required-features":["cli"],"doc":true,"doctest":false,"test":true},{"kind":["test"],"crate_types":["bin"],"name":"image_reader","src_path":"/ws/src/example/pixeldata/tests/image_reader.rs","edition":"2018","doc":false,"doctest":false,"test":true}],"features":{"charls":["dicom-transfer-syntax-registry/charls"],"cli":["dep:clap","dep:tracing-subscriber"],"default":["rayon","native"],"gdcm":["gdcm-rs"],"gdcm-rs":["dep:gdcm-rs"],"image":["dep:image"],"jpeg":["dicom-transfer-syntax-registry/jpeg"],"jpegxl":["dicom-transfer-syntax-registry/jpegxl"],"native":["dicom-transfer-syntax-registry/native","jpeg","rle"],"ndarray":["dep:ndarray"],"openjp2":["dicom-transfer-syntax-registry/openjp2"],"openjpeg-sys":["dicom-transfer-syntax-registry/openjpeg-sys"],"rayon":["dep:rayon","image?/rayon","dicom-transfer-syntax-registry/rayon"],"rle":["dicom-transfer-syntax-registry/rle"]},"manifest_path":"/ws/src/example/pixeldata/Cargo.toml","metadata":{"docs":{"rs":{"features":["image","ndarray"]}}},"publish":null,"authors":["Eduardo Pinho <[email protected]>","Peter Evers <[email protected]>"],"categories":["multimedia::images"],"keywords":["dicom"],"readme":"README.md","repository":"https://github.com/Enet4/dicom-rs","homepage":null,"documentation":null,"edition":"2018","links":null,"default_run":null,"rust_version":"1.72.0"},{"name":"dicom-scpproxy","version":"0.8.1","id":"path+file:///ws/src/example/scpproxy#[email protected]","license":"MIT OR Apache-2.0","license_file":null,"description":"A proxy SCP server, for logging and diagnostics","source":null,"dependencies":[{"name":"bytes","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^1.6","kind":null,"rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null},{"name":"clap","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^4.0.18","kind":null,"rename":null,"optional":false,"uses_default_features":true,"features":["cargo"],"target":null,"registry":null},{"name":"dicom-ul","source":null,"req":"^0.8.1","kind":null,"rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null,"path":"/ws/src/example/ul"},{"name":"snafu","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^0.8","kind":null,"rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null},{"name":"tracing","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^0.1.34","kind":null,"rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null},{"name":"tracing-subscriber","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^0.3.11","kind":null,"rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null}],"targets":[{"kind":["bin"],"crate_types":["bin"],"name":"dicom-scpproxy","src_path":"/ws/src/example/scpproxy/src/main.rs","edition":"2018","doc":true,"doctest":false,"test":true}],"features":{},"manifest_path":"/ws/src/example/scpproxy/Cargo.toml","metadata":null,"publish":null,"authors":["Eduardo Pinho <[email protected]>","Paul Knopf <[email protected]>"],"categories":["command-line-utilities"],"keywords":["dicom"],"readme":"README.md","repository":"https://github.com/Enet4/dicom-rs","homepage":null,"documentation":null,"edition":"2018","links":null,"default_run":null,"rust_version":null},{"name":"dicom-storescp","version":"0.8.1","id":"path+file:///ws/src/example/storescp#[email protected]","license":"MIT OR Apache-2.0","license_file":null,"description":"A server accepting DICOM C-STORE","source":null,"dependencies":[{"name":"clap","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^4.0.18","kind":null,"rename":null,"optional":false,"uses_default_features":true,"features":["derive"],"target":null,"registry":null},{"name":"dicom-core","source":null,"req":"^0.8.1","kind":null,"rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null,"path":"/ws/src/example/core"},{"name":"dicom-dictionary-std","source":null,"req":"^0.8.0","kind":null,"rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null,"path":"/ws/src/example/dictionary-std"},{"name":"dicom-encoding","source":null,"req":"^0.8.1","kind":null,"rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null,"path":"/ws/src/example/encoding"},{"name":"dicom-object","source":null,"req":"^0.8.1","kind":null,"rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null,"path":"/ws/src/example/object"},{"name":"dicom-transfer-syntax-registry","source":null,"req":"^0.8.1","kind":null,"rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null,"path":"/ws/src/example/transfer-syntax-registry"},{"name":"dicom-ul","source":null,"req":"^0.8.1","kind":null,"rename":null,"optional":false,"uses_default_features":true,"features":["async"],"target":null,"registry":null,"path":"/ws/src/example/ul"},{"name":"snafu","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^0.8","kind":null,"rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null},{"name":"tokio","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^1.38.0","kind":null,"rename":null,"optional":false,"uses_default_features":true,"features":["full"],"target":null,"registry":null},{"name":"tracing","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^0.1.36","kind":null,"rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null},{"name":"tracing-subscriber","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^0.3.15","kind":null,"rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null}],"targets":[{"kind":["bin"],"crate_types":["bin"],"name":"dicom-storescp","src_path":"/ws/src/example/storescp/src/main.rs","edition":"2021","doc":true,"doctest":false,"test":true}],"features":{},"manifest_path":"/ws/src/example/storescp/Cargo.toml","metadata":null,"publish":null,"authors":["Victor Saase <[email protected]>","Eduardo Pinho <[email protected]>"],"categories":["command-line-utilities"],"keywords":["dicom","store"],"readme":"README.md","repository":"https://github.com/Enet4/dicom-rs","homepage":null,"documentation":null,"edition":"2021","links":null,"default_run":null,"rust_version":null},{"name":"dicom-storescu","version":"0.8.1","id":"path+file:///ws/src/example/storescu#[email protected]","license":"MIT OR Apache-2.0","license_file":null,"description":"A DICOM C-ECHO command line interface","source":null,"dependencies":[{"name":"clap","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^4.0.18","kind":null,"rename":null,"optional":false,"uses_default_features":true,"features":["derive"],"target":null,"registry":null},{"name":"dicom-core","source":null,"req":"^0.8.1","kind":null,"rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null,"path":"/ws/src/example/core"},{"name":"dicom-dictionary-std","source":null,"req":"^0.8.0","kind":null,"rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null,"path":"/ws/src/example/dictionary-std"},{"name":"dicom-encoding","source":null,"req":"^0.8.1","kind":null,"rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null,"path":"/ws/src/example/encoding"},{"name":"dicom-object","source":null,"req":"^0.8.1","kind":null,"rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null,"path":"/ws/src/example/object"},{"name":"dicom-pixeldata","source":null,"req":"^0.8.1","kind":null,"rename":null,"optional":true,"uses_default_features":true,"features":[],"target":null,"registry":null,"path":"/ws/src/example/pixeldata"},{"name":"dicom-transfer-syntax-registry","source":null,"req":"^0.8.1","kind":null,"rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null,"path":"/ws/src/example/transfer-syntax-registry"},{"name":"dicom-ul","source":null,"req":"^0.8.1","kind":null,"rename":null,"optional":false,"uses_default_features":true,"features":["async"],"target":null,"registry":null,"path":"/ws/src/example/ul"},{"name":"indicatif","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^0.17.0","kind":null,"rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null},{"name":"snafu","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^0.8","kind":null,"rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null},{"name":"tokio","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^1.38.0","kind":null,"rename":null,"optional":false,"uses_default_features":true,"features":["rt","rt-multi-thread","macros","sync"],"target":null,"registry":null},{"name":"tracing","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^0.1.34","kind":null,"rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null},{"name":"tracing-subscriber","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^0.3.11","kind":null,"rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null},{"name":"walkdir","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^2.3.2","kind":null,"rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null}],"targets":[{"kind":["bin"],"crate_types":["bin"],"name":"dicom-storescu","src_path":"/ws/src/example/storescu/src/main.rs","edition":"2018","doc":true,"doctest":false,"test":true}],"features":{"default":["transcode"],"transcode":["dep:dicom-pixeldata"]},"manifest_path":"/ws/src/example/storescu/Cargo.toml","metadata":null,"publish":null,"authors":["Eduardo Pinho <[email protected]>"],"categories":["command-line-utilities"],"keywords":["dicom"],"readme":"README.md","repository":"https://github.com/Enet4/dicom-rs","homepage":null,"documentation":null,"edition":"2018","links":null,"default_run":null,"rust_version":null},{"name":"dicom-toimage","version":"0.8.0","id":"path+file:///ws/src/example/toimage#[email protected]","license":"MIT OR Apache-2.0","license_file":null,"description":"A CLI tool for converting DICOM files into general purpose image files","source":null,"dependencies":[{"name":"clap","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^4.0.18","kind":null,"rename":null,"optional":false,"uses_default_features":true,"features":["derive"],"target":null,"registry":null},{"name":"dicom-core","source":null,"req":"^0.8.1","kind":null,"rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null,"path":"/ws/src/example/core"},{"name":"dicom-dictionary-std","source":null,"req":"^0.8.0","kind":null,"rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null,"path":"/ws/src/example/dictionary-std"},{"name":"dicom-object","source":null,"req":"^0.8.1","kind":null,"rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null,"path":"/ws/src/example/object"},{"name":"dicom-pixeldata","source":null,"req":"^0.8.1","kind":null,"rename":null,"optional":false,"uses_default_features":false,"features":["image","rayon"],"target":null,"registry":null,"path":"/ws/src/example/pixeldata"},{"name":"snafu","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^0.8","kind":null,"rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null},{"name":"tracing","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^0.1.34","kind":null,"rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null},{"name":"tracing-subscriber","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^0.3.11","kind":null,"rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null}],"targets":[{"kind":["bin"],"crate_types":["bin"],"name":"dicom-toimage","src_path":"/ws/src/example/toimage/src/main.rs","edition":"2018","doc":true,"doctest":false,"test":true}],"features":{"default":["dicom-object/inventory-registry","dicom-pixeldata/native","dicom-pixeldata/jpegxl"]},"manifest_path":"/ws/src/example/toimage/Cargo.toml","metadata":null,"publish":null,"authors":["Eduardo Pinho <[email protected]>"],"categories":["command-line-utilities"],"keywords":["cli","dicom","image","image-conversion"],"readme":"README.md","repository":"https://github.com/Enet4/dicom-rs","homepage":null,"documentation":null,"edition":"2018","links":null,"default_run":null,"rust_version":"1.72.0"}],"workspace_members":["path+file:///ws/src/example/core#[email protected]","path+file:///ws/src/example/encoding#[email protected]","path+file:///ws/src/example/dictionary-std#[email protected]","path+file:///ws/src/example/parser#[email protected]","path+file:///ws/src/example/transfer-syntax-registry#[email protected]","path+file:///ws/src/example/object#[email protected]","path+file:///ws/src/example/devtools/dictionary-builder#[email protected]","path+file:///ws/src/example/dump#[email protected]","path+file:///ws/src/example/json#[email protected]","path+file:///ws/src/example/echoscu#[email protected]","path+file:///ws/src/example/ul#[email protected]","path+file:///ws/src/example/findscu#[email protected]","path+file:///ws/src/example/fromimage#[email protected]","path+file:///ws/src/example/parent#[email protected]","path+file:///ws/src/example/pixeldata#[email protected]","path+file:///ws/src/example/scpproxy#[email protected]","path+file:///ws/src/example/storescp#[email protected]","path+file:///ws/src/example/storescu#[email protected]","path+file:///ws/src/example/toimage#[email protected]"],"workspace_default_members":["path+file:///ws/src/example/findscu#[email protected]"],"resolve":null,"target_directory":"/ws/src/example/target","version":1,"workspace_root":"/ws/src/example","metadata":null}
#10 462.5 warning: field `timeout` is never read
...
Can that echoe'd json be suppressed? When line wrapped, it drowns out the rest of cargo's logs.
Can that echoe'd json be suppressed? When line wrapped, it drowns out the rest of cargo's logs.
Probably. Certainly out of scope for this PR.
@mxgrey feel free to merge this if the changes look good to you.
@maspe36 thanks for reviewing this PR and checking that it works.
I think we'll be in a good place to merge this after #62 is merged. If I can get an approval on that PR, then I'll merge it into this one and then approve and merge this PR.