dia-semver 11.0.1

For handling Semantic Versions 2.0.0
Documentation
/*
==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--

Dia-Semver

Copyright (C) 2018-2022  Anonymous

There are several releases over multiple years,
they are listed as ranges, such as: "2018-2022".

This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public License
along with this program.  If not, see <https://www.gnu.org/licenses/>.

::--::--::--::--::--::--::--::--::--::--::--::--::--::--::--::--
*/

use core::fmt::{self, Display, Formatter};

/// # Pre-release.
///
/// Some common pre-release phrases. Note that their string representation is in _lower-case_.
///
/// You can get this by [`Semver::parse_pre_release()`][Semver::parse_pre_release()].
///
/// [Semver::parse_pre_release()]: struct.Semver.html#method.parse_pre_release
#[derive(Debug, PartialEq, Eq)]
pub enum PreRelease {

    /// # Alpha
    Alpha,

    /// # Beta
    Beta,

    /// # RC
    RC,

    /// # Other
    Other,

}

impl PreRelease {

    /// # Parses a string to get a pre-release
    ///
    /// Notes:
    ///
    /// - The string should be passed from a **parsed** semver.
    /// - Case is ignored.
    pub (crate) fn parse<S>(parsed_pre_release: S) -> Self where S: AsRef<str> {
        let parsed_pre_release = parsed_pre_release.as_ref();

        // Note: do NOT trim the string
        let parsed_pre_release = parsed_pre_release.to_lowercase();
        if parsed_pre_release.starts_with("alpha") {
            return PreRelease::Alpha;
        } else if parsed_pre_release.starts_with("beta") {
            return PreRelease::Beta;
        } else if parsed_pre_release.starts_with("rc") {
            return PreRelease::RC;
        }

        PreRelease::Other
    }

}

impl Display for PreRelease {

    fn fmt(&self, f: &mut Formatter) -> Result<(), fmt::Error> {
        f.write_str(match self {
            PreRelease::Alpha => "alpha",
            PreRelease::Beta => "beta",
            PreRelease::RC => "rc",
            PreRelease::Other => "other",
        })
    }

}