3 个版本
0.1.2 | 2024年7月3日 |
---|---|
0.1.1 | 2024年6月28日 |
0.1.0 | 2024年6月28日 |
#1108 在 解析器实现
68 每月下载量
34KB
520 行
smvr
一个用于与语义版本字符串交互的灵活解析器和评估器。
语义版本控制 是一个规范,概述了版本字符串应该如何形成、递增和评估。
使用方法
[dependencies]
smvr = "0.1.2"
方言
方言反映了 SemVer 规范的解释。
方言必须实现一种根据一组确定性的规则解析版本字符串的方法。例如,不同的包管理器可能对 SemVer 字符串的样式施加不同的约束。这是一个专用方言的理想用例。
目前仅支持 Semver 版本 2.0.0。
方言 | 描述 |
---|---|
smvr::方言::标准 |
遵循 语义版本控制 2.0.0 规范。 |
解析版本字符串
版本字符串被解析为 smvr::Version
实例。在尝试解析版本字符串时,必须提供要使用的方言。
方言执行验证,并在解析过程中进行。这有助于确保仅返回有效的版本字符串。
use smvr::{BuildMetadata, Prerelease, PrereleaseComponent, Version};
use smvr::Dialect;
use smvr::Error;
let version = Version::parse(
"10.2.1-alpha.1+build-1",
Dialect::Standard
)?;
assert_eq!(version.major, 10);
assert_eq!(version.minor, 2);
assert_eq!(version.patch, 1);
assert_eq!(
version.prerelease,
Prerelease::Identifier(
vec![
PrereleaseComponent::String("alpha".to_string()),
PrereleaseComponent::Number(1)
]
)
);
assert_eq!(version.build_metadata, BuildMetadata::Identifier("build-1".to_string()));
比较版本
使用同一方言解析的 smvr::Version
实例可以相互比较。
比较行为特定于方言,可以用于确定性地评估两个或多个版本字符串的时间顺序。
例如: 1.0.0-alpha.1
< 1.0.0-alpha.2
< 1.0.0-beta
< 1.0.0
< 1.0.1
use smvr::{Dialect, Version};
use smvr::Error;
let version_1 = Version::parse("1.0.0", Dialect::Standard)?;
let version_1_0_1_alpha_9 = Version::parse("1.0.1-alpha.9", Dialect::Standard)?;
let version_1_0_1_beta_2 = Version::parse("1.0.1-beta.2", Dialect::Standard)?;
let version_1_0_1_beta_10 = Version::parse("1.0.1-beta.10", Dialect::Standard)?;
let version_1_0_1 = Version::parse("1.0.1", Dialect::Standard)?;
assert_ne!(version_1, version_1_0_1);
assert!(version_1 < version_1_0_1);
assert!(version_1_0_1_alpha_9 < version_1_0_1_beta_10);
assert!(version_1_0_1_beta_2 < version_1_0_1_beta_10);
assert!(version_1_0_1_beta_10 < version_1_0_1);
处理错误
在解析过程中,每个字节都会被读取,如果遇到任何不符合方言实现的规则的字节,将返回错误。
这些错误在较高层面上指示了错误的原因(例如,无效字符)以及错误发生的位置(即在以下部分之一:主要版本、次要版本、修订版本、预发布版本、构建元数据)。
错误被积极返回,这意味着 第一个 遇到的无效字节将触发错误。这并不保证版本字符串的其余部分没有更多违规。
use smvr::{Dialect, PartType, Version};
use smvr::Error;
let invalid_preceding_zero_version = Version::parse("1.001.0", Dialect::Standard);
let invalid_character_version = Version::parse("abc.1.0", Dialect::Standard);
assert!(invalid_preceding_zero_version.is_err());
assert!(invalid_character_version.is_err());
if let Err(error) = invalid_preceding_zero_version {
assert_eq!(error, Error::InvalidPrecedingZero(PartType::Minor))
}
if let Err(error) = invalid_character_version {
assert_eq!(error, Error::InvalidCharacter(PartType::Major))
}