#version-string #semver #version #semantic #parser

smvr

一个用于与语义版本字符串交互的灵活解析器和评估器

3 个版本

0.1.2 2024年7月3日
0.1.1 2024年6月28日
0.1.0 2024年6月28日

#1108解析器实现

Download history 222/week @ 2024-06-22 133/week @ 2024-06-29 31/week @ 2024-07-06 22/week @ 2024-07-27

68 每月下载量

MIT 许可协议

34KB
520

Coverage Crates.io Version Crates.io Total Downloads docs.rs Build GitHub License

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))
}

没有运行时依赖