Skip to main content

ephemeris_forge/access/
observed.rs

1use std::fmt;
2use std::str::FromStr;
3
4/// A permission read from a forge, which may be one this tool cannot set.
5#[derive(Clone, Debug, Eq, PartialEq)]
6pub enum Observed<P> {
7    /// A permission the configuration can also declare.
8    Known(P),
9    /// Any other permission, kept as the forge spelled it.
10    Unknown(String),
11}
12
13impl<P: FromStr> Observed<P> {
14    /// Read the forge's spelling of a permission.
15    #[must_use]
16    pub fn parse(raw: &str) -> Self {
17        raw.parse()
18            .map_or_else(|_unknown| Self::Unknown(raw.to_owned()), Self::Known)
19    }
20}
21
22impl<P: PartialEq> PartialEq<P> for Observed<P> {
23    fn eq(&self, other: &P) -> bool {
24        matches!(self, Self::Known(known) if known == other)
25    }
26}
27
28impl<P: fmt::Display> fmt::Display for Observed<P> {
29    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
30        match self {
31            Self::Known(known) => known.fmt(f),
32            Self::Unknown(raw) => raw.fmt(f),
33        }
34    }
35}