1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
//! uv-sbom - SBOM generation tool for uv projects
//!
//! This library provides functionality to generate Software Bill of Materials (SBOM)
//! from uv.lock files, following hexagonal architecture and Domain-Driven Design principles.
//!
//! # Architecture
//!
//! The library is organized into the following layers:
//!
//! - **Domain Layer** (`sbom_generation`): Pure business logic and domain models
//! - **Application Layer** (`application`): Use cases and application services
//! - **Ports** (`ports`): Interface definitions for infrastructure
//! - **Adapters** (`adapters`): Concrete implementations of ports
//! - **Shared** (`shared`): Common utilities and error types
//!
//! # Example
//!
//! ```no_run
//! use uv_sbom::prelude::*;
//! use std::path::PathBuf;
//!
//! # #[tokio::main]
//! # async fn main() -> Result<()> {
//! // Create adapters
//! let lockfile_reader = FileSystemReader::new();
//! let project_config_reader = FileSystemReader::new();
//! let license_repository = PyPiLicenseRepository::new()?;
//! let progress_reporter = StderrProgressReporter::new(uv_sbom::i18n::Locale::default());
//!
//! // Create use case
//! let use_case: GenerateSbomUseCase<_, _, _, _, ()> = GenerateSbomUseCase::new(
//! lockfile_reader,
//! project_config_reader,
//! license_repository,
//! progress_reporter,
//! None, // No vulnerability checking in this example
//! uv_sbom::i18n::Locale::default(),
//! );
//!
//! // Execute
//! let request = SbomRequest::builder()
//! .project_path(".")
//! .build()?;
//! let response = use_case.execute(request).await?;
//!
//! // Build read model and format output
//! let read_model = uv_sbom::application::read_models::SbomReadModelBuilder::build_with_project(
//! response.enriched_packages,
//! &response.metadata,
//! None,
//! None,
//! None,
//! None,
//! None,
//! );
//! let formatter = CycloneDxFormatter::new();
//! let output = formatter.format(&read_model)?;
//! println!("{}", output);
//! # Ok(())
//! # }
//! ```
/// Prelude module for convenient imports