//-
// Copyright 2017, 2018 The proptest developers
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.

use crate::std_facade::{fmt, Cow, String, Box};

/// The reason for why something, such as a generated value, was rejected.
///
/// Currently this is merely a wrapper around a message, but more properties
/// may be added in the future.
///
/// This is constructed via `.into()` on a `String`, `&'static str`, or
/// `Box<str>`.
#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct Reason(Cow<'static, str>);

impl Reason {
    /// Return the message for this `Reason`.
    ///
    /// The message is intended for human consumption, and is not guaranteed to
    /// have any format in particular.
    pub fn message(&self) -> &str {
        &*self.0
    }
}

impl From<&'static str> for Reason {
    fn from(s: &'static str) -> Self {
        Reason(s.into())
    }
}

impl From<String> for Reason {
    fn from(s: String) -> Self {
        Reason(s.into())
    }
}

impl From<Box<str>> for Reason {
    fn from(s: Box<str>) -> Self {
        Reason(String::from(s).into())
    }
}

impl fmt::Display for Reason {
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        fmt::Display::fmt(self.message(), f)
    }
}
