uv_configuration/
required_version.rs

1#[cfg(feature = "schemars")]
2use std::borrow::Cow;
3use std::{fmt::Formatter, str::FromStr};
4
5use uv_pep440::{Version, VersionSpecifier, VersionSpecifiers, VersionSpecifiersParseError};
6
7/// A required version of uv, represented as a version specifier (e.g. `>=0.5.0`).
8#[derive(Clone, Debug, PartialEq, Eq)]
9pub struct RequiredVersion(VersionSpecifiers);
10
11impl RequiredVersion {
12    /// Return `true` if the given version is required.
13    pub fn contains(&self, version: &Version) -> bool {
14        self.0.contains(version)
15    }
16
17    /// Returns the underlying [`VersionSpecifiers`].
18    pub fn specifiers(&self) -> &VersionSpecifiers {
19        &self.0
20    }
21}
22
23impl FromStr for RequiredVersion {
24    type Err = VersionSpecifiersParseError;
25
26    fn from_str(s: &str) -> Result<Self, Self::Err> {
27        // Treat `0.5.0` as `==0.5.0`, for backwards compatibility.
28        if let Ok(version) = Version::from_str(s) {
29            Ok(Self(VersionSpecifiers::from(
30                VersionSpecifier::equals_version(version),
31            )))
32        } else {
33            Ok(Self(VersionSpecifiers::from_str(s)?))
34        }
35    }
36}
37
38#[cfg(feature = "schemars")]
39impl schemars::JsonSchema for RequiredVersion {
40    fn schema_name() -> Cow<'static, str> {
41        Cow::Borrowed("RequiredVersion")
42    }
43
44    fn json_schema(_generator: &mut schemars::generate::SchemaGenerator) -> schemars::Schema {
45        schemars::json_schema!({
46            "type": "string",
47            "description": "A version specifier, e.g. `>=0.5.0` or `==0.5.0`."
48        })
49    }
50}
51
52impl<'de> serde::Deserialize<'de> for RequiredVersion {
53    fn deserialize<D: serde::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
54        struct Visitor;
55
56        impl serde::de::Visitor<'_> for Visitor {
57            type Value = RequiredVersion;
58
59            fn expecting(&self, f: &mut Formatter) -> std::fmt::Result {
60                f.write_str("a string")
61            }
62
63            fn visit_str<E: serde::de::Error>(self, v: &str) -> Result<Self::Value, E> {
64                RequiredVersion::from_str(v).map_err(serde::de::Error::custom)
65            }
66        }
67
68        deserializer.deserialize_str(Visitor)
69    }
70}
71
72impl std::fmt::Display for RequiredVersion {
73    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
74        std::fmt::Display::fmt(&self.0, f)
75    }
76}