1pub use crate::extras::*;
2pub use crate::lookahead::*;
3pub use crate::source_tree::*;
4pub use crate::sources::*;
5pub use crate::specification::*;
6pub use crate::unnamed::*;
7
8use uv_distribution_types::{
9 Dist, DistErrorKind, GitSourceDist, Requirement, RequirementSource, SourceDist,
10};
11
12mod extras;
13mod lookahead;
14mod source_tree;
15mod sources;
16mod specification;
17mod unnamed;
18pub mod upgrade;
19
20#[derive(Debug, thiserror::Error)]
21pub enum Error {
22 #[error("{0} `{1}`")]
23 Dist(DistErrorKind, Box<Dist>, #[source] uv_distribution::Error),
24
25 #[error(transparent)]
26 Distribution(#[from] uv_distribution::Error),
27
28 #[error(transparent)]
29 DistributionTypes(#[from] uv_distribution_types::Error),
30
31 #[error(transparent)]
32 WheelFilename(#[from] uv_distribution_filename::WheelFilenameError),
33
34 #[error(transparent)]
35 Io(#[from] std::io::Error),
36}
37
38impl Error {
39 pub(crate) fn from_dist(dist: Dist, err: uv_distribution::Error) -> Self {
41 Self::Dist(DistErrorKind::from_dist(&dist, &err), Box::new(dist), err)
42 }
43}
44
45pub(crate) fn required_dist(
47 requirement: &Requirement,
48) -> Result<Option<Dist>, uv_distribution_types::Error> {
49 Ok(Some(match &requirement.source {
50 RequirementSource::Registry { .. } => return Ok(None),
51 RequirementSource::Url {
52 subdirectory,
53 location,
54 ext,
55 url,
56 } => Dist::from_http_url(
57 requirement.name.clone(),
58 url.clone(),
59 location.clone(),
60 subdirectory.clone(),
61 *ext,
62 )?,
63 RequirementSource::Git {
64 git,
65 subdirectory,
66 url,
67 } => Dist::Source(SourceDist::Git(GitSourceDist {
68 name: requirement.name.clone(),
69 git: Box::new(git.clone()),
70 subdirectory: subdirectory.clone(),
71 url: url.clone(),
72 })),
73 RequirementSource::Path {
74 install_path,
75 ext,
76 url,
77 } => Dist::from_file_url(requirement.name.clone(), url.clone(), install_path, *ext)?,
78 RequirementSource::Directory {
79 install_path,
80 r#virtual,
81 url,
82 editable,
83 } => Dist::from_directory_url(
84 requirement.name.clone(),
85 url.clone(),
86 install_path,
87 *editable,
88 *r#virtual,
89 )?,
90 }))
91}