// License: see LICENSE file at root directory of `master` branch

//! # An implementation of <https://semver.org>
//!
//! ## Project
//!
//! - Repository: <https://bitbucket.org/haibison/dia-semver>
//! - License: Nice License 1.0.0 _(see LICENSE file at root directory of `master` branch)_
//! - _This project follows [Semantic Versioning 2.0.0]_
//!
//! ## Features
//!
//! - Supporting [2.0.0 specification](https://semver.org/spec/v2.0.0.html).
//! - Tolerant parser: leading/trailing white spaces are ignored; minor and patch version numbers are optional. This parser is added
//!   by the crate author, and is not described in official specification. See [`Semver`][struct:Semver] for more details.
//! - Handy functions: [`is_stable()`][fn:Semver#is_stable], [`is_early()`][fn:Semver#is_early],
//!   [`parse_pre_release()`][fn:Semver#parse_pre_release], [`new_major()`][fn:Semver#new_major], [`new_minor()`][fn:Semver#new_minor],
//!   [`new_patch()`][fn:Semver#new_patch]...
//!
//! ## Notes
//!
//! Documentation is built with all features. Some of them are optional. If you see components from other crates, you can view source to see
//! what features are required.
//!
//! [Semantic Versioning 2.0.0]: https://semver.org/spec/v2.0.0.html
//! [struct:Semver]: struct.Semver.html
//! [fn:Semver#is_stable]: struct.Semver.html#method.is_stable
//! [fn:Semver#is_early]: struct.Semver.html#method.is_early
//! [fn:Semver#parse_pre_release]: struct.Semver.html#method.parse_pre_release
//! [fn:Semver#new_major]: struct.Semver.html#method.new_major
//! [fn:Semver#new_minor]: struct.Semver.html#method.new_minor
//! [fn:Semver#new_patch]: struct.Semver.html#method.new_patch

#![warn(missing_docs)]
#![no_std]

// ╔═════════════════╗
// ║   IDENTIFIERS   ║
// ╚═════════════════╝

macro_rules! code_name  { () => { "dia-semver" }}
macro_rules! version    { () => { "8.3.1" }}

/// # Crate name
pub const NAME: &str = "Dia-semver";

/// # Crate code name
pub const CODE_NAME: &str = code_name!();

/// # ID of this crate
pub const ID: &str = concat!(
    "af689fae-61017e3f-351f0b5a-2db0c53a-d2536361-c9b37bd2-db807b5d-c46e6e53-",
    "ff22efd1-0f308e5a-8cfbb056-640af5db-7736e6eb-7f67b62a-be63deee-226e148c",
);

/// # Crate version
pub const VERSION: &str = version!();

/// # Crate release date (year/month/day)
pub const RELEASE_DATE: (u16, u8, u8) = (2021, 3, 22);

/// # Tag, which can be used for logging...
pub const TAG: &str = concat!(code_name!(), "::af689fae::", version!());

// ╔════════════════════╗
// ║   IMPLEMENTATION   ║
// ╚════════════════════╝

extern crate alloc;

#[cfg(feature="std")]
extern crate std;

mod parse_semver_error;
mod pre_release;
mod range;
mod semver;

pub use self::{
    parse_semver_error::*,
    pre_release::*,
    semver::*,
};

#[allow(deprecated)]
pub use self::{
    range::*,
};

pub mod specification;
pub mod version_info;

/// # Result type used in this crate
pub type Result<T> = core::result::Result<T, ParseSemverError>;

#[test]
fn test_crate_version() {
    assert_eq!(VERSION, env!("CARGO_PKG_VERSION"));
}
