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

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

}
