Struct abi_stable::sabi_types::version::VersionNumber
source · #[repr(C)]pub struct VersionNumber {
pub major: u32,
pub minor: u32,
pub patch: u32,
}
Expand description
The parsed (<major>.<minor>.<patch>
) version number of a library.
§Post 1.0 major version
Major versions are mutually incompatible for both users and implementors.
Minor allow users to have a version less than or equal to that of the implementor, and disallows implementors from making changes that would break any previous minor release (with the same major number).
Patch cannot change the api/abi of the library at all,fixes only.
§Example
use abi_stable::sabi_types::VersionNumber;
let v0_1_0 = VersionNumber {
major: 0,
minor: 1,
patch: 0,
};
let v0_1_5 = VersionNumber {
major: 0,
minor: 1,
patch: 5,
};
let v0_1_8 = VersionNumber {
major: 0,
minor: 1,
patch: 8,
};
let v0_2_0 = VersionNumber {
major: 0,
minor: 2,
patch: 0,
};
assert!(v0_1_0.is_compatible(v0_1_5), "'{}' '{}'", v0_1_0, v0_1_5);
assert!(v0_1_5.is_compatible(v0_1_8), "'{}' '{}'", v0_1_5, v0_1_8);
assert!(!v0_1_8.is_compatible(v0_2_0), "'{}' '{}'", v0_1_8, v0_2_0);
Fields§
§major: u32
§minor: u32
§patch: u32
Implementations§
source§impl VersionNumber
impl VersionNumber
sourcepub fn new(vn: VersionStrings) -> Result<Self, ParseVersionError>
pub fn new(vn: VersionStrings) -> Result<Self, ParseVersionError>
Attempts to convert a VersionStrings
into a VersionNumber
§Errors
This returns a ParseVersionError
if the string is not correctly formatted.
§Example
use abi_stable::sabi_types::{VersionNumber, VersionStrings};
static VERSION: VersionStrings = VersionStrings::new("10.5.20");
assert_eq!(
VersionNumber::new(VERSION),
Ok(VersionNumber {
major: 10,
minor: 5,
patch: 20
})
);
let err_version = VersionStrings::new("not a version number");
assert!(VersionNumber::new(err_version).is_err());
sourcepub const fn is_compatible(self, library_implementor: VersionNumber) -> bool
pub const fn is_compatible(self, library_implementor: VersionNumber) -> bool
Whether the self
version number is compatible with the
library_implementor
version number.
This uses modified semver rules where:
-
For 0.y.z ,y is interpreted as a major version, z is interpreted as the minor version,
-
For x.y.z ,x>=1,y is interpreted as a minor version.
-
Libraries are compatible so long as they are the same major version with a minor_version >=
self
.
§Example
use abi_stable::sabi_types::VersionNumber;
let v0_1_0 = VersionNumber {
major: 0,
minor: 1,
patch: 0,
};
let v0_1_5 = VersionNumber {
major: 0,
minor: 1,
patch: 5,
};
let v0_1_8 = VersionNumber {
major: 0,
minor: 1,
patch: 8,
};
let v0_2_0 = VersionNumber {
major: 0,
minor: 2,
patch: 0,
};
assert!(v0_1_0.is_compatible(v0_1_5), "'{}' '{}'", v0_1_0, v0_1_5);
assert!(v0_1_5.is_compatible(v0_1_8), "'{}' '{}'", v0_1_5, v0_1_8);
assert!(!v0_1_8.is_compatible(v0_2_0), "'{}' '{}'", v0_1_8, v0_2_0);
sourcepub const fn is_loosely_compatible(
self,
library_implementor: VersionNumber,
) -> bool
pub const fn is_loosely_compatible( self, library_implementor: VersionNumber, ) -> bool
Whether the self
version number is compatible with the
library version number.
This uses the same semver rules as cargo:
-
For 0.y.z ,y is interpreted as a major version, z is interpreted as the minor version,
-
For x.y.z ,x>=1,y is interpreted as a minor version.
-
Libraries are compatible so long as they are the same major version irrespective of their minor version.
§Example
use abi_stable::sabi_types::VersionNumber;
let v0_1_0 = VersionNumber {
major: 0,
minor: 1,
patch: 0,
};
let v0_1_5 = VersionNumber {
major: 0,
minor: 1,
patch: 5,
};
let v0_1_8 = VersionNumber {
major: 0,
minor: 1,
patch: 8,
};
let v0_2_0 = VersionNumber {
major: 0,
minor: 2,
patch: 0,
};
let v0_2_8 = VersionNumber {
major: 0,
minor: 2,
patch: 8,
};
let v1_0_0 = VersionNumber {
major: 1,
minor: 0,
patch: 0,
};
let v1_5_0 = VersionNumber {
major: 1,
minor: 5,
patch: 0,
};
let v2_0_0 = VersionNumber {
major: 2,
minor: 0,
patch: 0,
};
fn is_compat_assert(l: VersionNumber, r: VersionNumber, are_they_compat: bool) {
assert_eq!(l.is_loosely_compatible(r), are_they_compat);
assert_eq!(r.is_loosely_compatible(l), are_they_compat);
}
is_compat_assert(v0_1_0, v0_1_5, true);
is_compat_assert(v0_1_5, v0_1_8, true);
is_compat_assert(v1_0_0, v1_5_0, true);
is_compat_assert(v0_1_8, v0_2_0, false);
is_compat_assert(v0_2_8, v1_0_0, false);
is_compat_assert(v2_0_0, v1_0_0, false);
is_compat_assert(v2_0_0, v1_5_0, false);
Trait Implementations§
source§impl Clone for VersionNumber
impl Clone for VersionNumber
source§fn clone(&self) -> VersionNumber
fn clone(&self) -> VersionNumber
1.0.0 · source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source
. Read moresource§impl Debug for VersionNumber
impl Debug for VersionNumber
source§impl Display for VersionNumber
impl Display for VersionNumber
source§impl GetStaticEquivalent_ for VersionNumber
impl GetStaticEquivalent_ for VersionNumber
source§type StaticEquivalent = _static_VersionNumber
type StaticEquivalent = _static_VersionNumber
'static
equivalent of Self
source§impl PartialEq for VersionNumber
impl PartialEq for VersionNumber
source§impl StableAbi for VersionNumber
impl StableAbi for VersionNumber
source§type IsNonZeroType = False
type IsNonZeroType = False
source§const LAYOUT: &'static TypeLayout = _
const LAYOUT: &'static TypeLayout = _
source§const ABI_CONSTS: AbiConsts = _
const ABI_CONSTS: AbiConsts = _
const
-equivalents of the associated types.impl Copy for VersionNumber
impl Eq for VersionNumber
impl StructuralPartialEq for VersionNumber
Auto Trait Implementations§
impl Freeze for VersionNumber
impl RefUnwindSafe for VersionNumber
impl Send for VersionNumber
impl Sync for VersionNumber
impl Unpin for VersionNumber
impl UnwindSafe for VersionNumber
Blanket Implementations§
source§impl<T> AlignerFor<1> for T
impl<T> AlignerFor<1> for T
source§impl<T> AlignerFor<1024> for T
impl<T> AlignerFor<1024> for T
source§type Aligner = AlignTo1024<T>
type Aligner = AlignTo1024<T>
AlignTo*
type which aligns Self
to ALIGNMENT
.source§impl<T> AlignerFor<128> for T
impl<T> AlignerFor<128> for T
source§type Aligner = AlignTo128<T>
type Aligner = AlignTo128<T>
AlignTo*
type which aligns Self
to ALIGNMENT
.source§impl<T> AlignerFor<16> for T
impl<T> AlignerFor<16> for T
source§impl<T> AlignerFor<16384> for T
impl<T> AlignerFor<16384> for T
source§type Aligner = AlignTo16384<T>
type Aligner = AlignTo16384<T>
AlignTo*
type which aligns Self
to ALIGNMENT
.source§impl<T> AlignerFor<2> for T
impl<T> AlignerFor<2> for T
source§impl<T> AlignerFor<2048> for T
impl<T> AlignerFor<2048> for T
source§type Aligner = AlignTo2048<T>
type Aligner = AlignTo2048<T>
AlignTo*
type which aligns Self
to ALIGNMENT
.source§impl<T> AlignerFor<256> for T
impl<T> AlignerFor<256> for T
source§type Aligner = AlignTo256<T>
type Aligner = AlignTo256<T>
AlignTo*
type which aligns Self
to ALIGNMENT
.source§impl<T> AlignerFor<32> for T
impl<T> AlignerFor<32> for T
source§impl<T> AlignerFor<32768> for T
impl<T> AlignerFor<32768> for T
source§type Aligner = AlignTo32768<T>
type Aligner = AlignTo32768<T>
AlignTo*
type which aligns Self
to ALIGNMENT
.source§impl<T> AlignerFor<4> for T
impl<T> AlignerFor<4> for T
source§impl<T> AlignerFor<4096> for T
impl<T> AlignerFor<4096> for T
source§type Aligner = AlignTo4096<T>
type Aligner = AlignTo4096<T>
AlignTo*
type which aligns Self
to ALIGNMENT
.source§impl<T> AlignerFor<512> for T
impl<T> AlignerFor<512> for T
source§type Aligner = AlignTo512<T>
type Aligner = AlignTo512<T>
AlignTo*
type which aligns Self
to ALIGNMENT
.source§impl<T> AlignerFor<64> for T
impl<T> AlignerFor<64> for T
source§impl<T> AlignerFor<8> for T
impl<T> AlignerFor<8> for T
source§impl<T> AlignerFor<8192> for T
impl<T> AlignerFor<8192> for T
source§type Aligner = AlignTo8192<T>
type Aligner = AlignTo8192<T>
AlignTo*
type which aligns Self
to ALIGNMENT
.source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
source§unsafe fn clone_to_uninit(&self, dst: *mut T)
unsafe fn clone_to_uninit(&self, dst: *mut T)
clone_to_uninit
)source§impl<'a, T> RCowCompatibleRef<'a> for Twhere
T: Clone + 'a,
impl<'a, T> RCowCompatibleRef<'a> for Twhere
T: Clone + 'a,
source§fn as_c_ref(from: &'a T) -> <T as RCowCompatibleRef<'a>>::RefC
fn as_c_ref(from: &'a T) -> <T as RCowCompatibleRef<'a>>::RefC
source§fn as_rust_ref(from: <T as RCowCompatibleRef<'a>>::RefC) -> &'a T
fn as_rust_ref(from: <T as RCowCompatibleRef<'a>>::RefC) -> &'a T
source§impl<S> ROExtAcc for S
impl<S> ROExtAcc for S
source§fn f_get<F>(&self, offset: FieldOffset<S, F, Aligned>) -> &F
fn f_get<F>(&self, offset: FieldOffset<S, F, Aligned>) -> &F
offset
. Read moresource§fn f_get_mut<F>(&mut self, offset: FieldOffset<S, F, Aligned>) -> &mut F
fn f_get_mut<F>(&mut self, offset: FieldOffset<S, F, Aligned>) -> &mut F
offset
. Read moresource§fn f_get_ptr<F, A>(&self, offset: FieldOffset<S, F, A>) -> *const F
fn f_get_ptr<F, A>(&self, offset: FieldOffset<S, F, A>) -> *const F
offset
. Read moresource§fn f_get_mut_ptr<F, A>(&mut self, offset: FieldOffset<S, F, A>) -> *mut F
fn f_get_mut_ptr<F, A>(&mut self, offset: FieldOffset<S, F, A>) -> *mut F
offset
. Read moresource§impl<S> ROExtOps<Aligned> for S
impl<S> ROExtOps<Aligned> for S
source§fn f_replace<F>(&mut self, offset: FieldOffset<S, F, Aligned>, value: F) -> F
fn f_replace<F>(&mut self, offset: FieldOffset<S, F, Aligned>, value: F) -> F
offset
) with value
,
returning the previous value of the field. Read moresource§fn f_get_copy<F>(&self, offset: FieldOffset<S, F, Aligned>) -> Fwhere
F: Copy,
fn f_get_copy<F>(&self, offset: FieldOffset<S, F, Aligned>) -> Fwhere
F: Copy,
source§impl<S> ROExtOps<Unaligned> for S
impl<S> ROExtOps<Unaligned> for S
source§fn f_replace<F>(&mut self, offset: FieldOffset<S, F, Unaligned>, value: F) -> F
fn f_replace<F>(&mut self, offset: FieldOffset<S, F, Unaligned>, value: F) -> F
offset
) with value
,
returning the previous value of the field. Read moresource§fn f_get_copy<F>(&self, offset: FieldOffset<S, F, Unaligned>) -> Fwhere
F: Copy,
fn f_get_copy<F>(&self, offset: FieldOffset<S, F, Unaligned>) -> Fwhere
F: Copy,
source§impl<T> SelfOps for Twhere
T: ?Sized,
impl<T> SelfOps for Twhere
T: ?Sized,
source§fn piped<F, U>(self, f: F) -> U
fn piped<F, U>(self, f: F) -> U
source§fn piped_ref<'a, F, U>(&'a self, f: F) -> Uwhere
F: FnOnce(&'a Self) -> U,
fn piped_ref<'a, F, U>(&'a self, f: F) -> Uwhere
F: FnOnce(&'a Self) -> U,
piped
except that the function takes &Self
Useful for functions that take &Self
instead of Self
. Read moresource§fn piped_mut<'a, F, U>(&'a mut self, f: F) -> Uwhere
F: FnOnce(&'a mut Self) -> U,
fn piped_mut<'a, F, U>(&'a mut self, f: F) -> Uwhere
F: FnOnce(&'a mut Self) -> U,
piped
, except that the function takes &mut Self
.
Useful for functions that take &mut Self
instead of Self
.source§fn mutated<F>(self, f: F) -> Self
fn mutated<F>(self, f: F) -> Self
source§fn observe<F>(self, f: F) -> Self
fn observe<F>(self, f: F) -> Self
source§fn as_ref_<T>(&self) -> &T
fn as_ref_<T>(&self) -> &T
AsRef
,
using the turbofish .as_ref_::<_>()
syntax. Read more