VersionComparator

Struct VersionComparator 

Source
pub struct VersionComparator;
Expand description

Version comparison utilities for semantic version operations.

This struct provides static methods for comparing semantic versions, finding newer versions, and handling version parsing with common prefixes. All methods are designed to handle malformed version strings gracefully.

Implementations§

Source§

impl VersionComparator

Source

pub fn has_newer_version(current: &str, versions: &[String]) -> Result<bool>

Checks if there are newer versions available than the current version.

This method compares the current version against a list of available versions and returns true if any version is semantically newer.

§Arguments
  • current - The current version string (e.g., “v1.0.0”, “1.2.3”)
  • versions - A slice of version strings to compare against
§Returns

Ok(true) if newer versions exist, Ok(false) if current is latest.

§Errors

Returns an error if the current version string cannot be parsed as a semantic version. Malformed versions in the comparison list are ignored.

§Examples
use agpm_cli::version::comparison::VersionComparator;

let versions = vec!["v1.0.0".to_string(), "v1.1.0".to_string(), "v2.0.0".to_string()];

// Check if v1.0.0 has newer versions available
let has_newer = VersionComparator::has_newer_version("v1.0.0", &versions)?;
assert!(has_newer);

// Check if v2.0.0 is the latest
let has_newer = VersionComparator::has_newer_version("v2.0.0", &versions)?;
assert!(!has_newer);
Source

pub fn get_newer_versions<'a>( current: &str, versions: &'a [String], ) -> Result<Vec<&'a String>>

Gets all versions newer than the current version, sorted by version descending.

This method finds all versions in the provided list that are semantically newer than the current version and returns them sorted from newest to oldest.

§Arguments
  • current - The current version string to compare against
  • versions - A slice of version strings to search
§Returns

A vector of references to version strings that are newer than current, sorted in descending order (newest first).

§Errors

Returns an error if the current version string cannot be parsed. Malformed versions in the search list are silently ignored.

§Examples
use agpm_cli::version::comparison::VersionComparator;

let versions = vec![
    "v1.0.0".to_string(),
    "v1.2.0".to_string(),
    "v1.1.0".to_string(),
    "v2.0.0".to_string(),
];

let newer = VersionComparator::get_newer_versions("v1.0.0", &versions)?;
assert_eq!(newer.len(), 3);
// Results are sorted newest first
assert_eq!(newer[0], "v2.0.0");
assert_eq!(newer[1], "v1.2.0");
assert_eq!(newer[2], "v1.1.0");
Source

pub fn get_latest(versions: &[String]) -> Result<Option<&String>>

Gets the latest (highest) semantic version from a list of versions.

This method finds the semantically highest version from the provided list, ignoring any malformed version strings.

§Arguments
  • versions - A slice of version strings to search
§Returns

Ok(Some(&String)) with the latest version, or Ok(None) if the list is empty or contains no valid semantic versions.

§Errors

This method does not return errors - malformed version strings are silently ignored during comparison.

§Examples
use agpm_cli::version::comparison::VersionComparator;

let versions = vec![
    "v1.0.0".to_string(),
    "v2.0.0".to_string(),
    "v1.5.0".to_string(),
    "invalid-version".to_string(), // This will be ignored
];

let latest = VersionComparator::get_latest(&versions)?
    .expect("Should find a latest version");
assert_eq!(latest, "v2.0.0");

// Empty list returns None
let empty: Vec<String> = vec![];
assert!(VersionComparator::get_latest(&empty)?.is_none());

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

impl<T> Pointable for T

Source§

const ALIGN: usize

The alignment of pointer.
Source§

type Init = T

The type for initializers.
Source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
Source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
Source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
Source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

impl<T> PolicyExt for T
where T: ?Sized,

Source§

fn and<P, B, E>(self, other: P) -> And<T, P>
where T: Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow only if self and other return Action::Follow. Read more
Source§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where T: Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow if either self or other returns Action::Follow. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more