uv_requirements/
lib.rs

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    /// Create an [`Error`] from a distribution error.
40    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
45/// Convert a [`Requirement`] into a [`Dist`], if it is a direct URL.
46pub(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}