pib-service-inventory 0.13.1

Inventory interface library to be used in pib-service
Documentation
// SPDX-FileCopyrightText: Politik im Blick developers
// SPDX-FileCopyrightText: Wolfgang Silbermayr <wolfgang@silbermayr.at>
//
// SPDX-License-Identifier: AGPL-3.0-or-later OR EUPL-1.2

use std::str::FromStr;

use snafu::Snafu;

mod identifiers {
    pub const APPOINTED: &str = "terminiert";
    pub const INVITED: &str = "eingeladen";
    pub const EXECUTED: &str = "durchgeführt";
}

#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum MeetingState {
    /// Meeting has been appointed. Equivalent in German as mentioned in the
    /// OParl standard: `terminiert`.
    Appointed,

    /// Participants have been invited to the meeting. Equivalent in German as
    /// mentioned in the OParl standard: `eingeladen`.
    Invited,

    /// Meeting has been held, and the protocol has been approved. Equivalent in
    /// German as mentioned in the OParl standard: `durchgeführt`.
    Executed,
}

impl From<MeetingState> for String {
    fn from(value: MeetingState) -> Self {
        value.as_str().to_string()
    }
}

impl MeetingState {
    pub const fn as_str(&self) -> &'static str {
        match self {
            MeetingState::Appointed => identifiers::APPOINTED,
            MeetingState::Invited => identifiers::INVITED,
            MeetingState::Executed => identifiers::EXECUTED,
        }
    }
}

#[derive(Debug, Snafu)]
#[snafu(display("Error parsing value {value:?} as meeting state"))]
pub struct ParseMeetingStateError {
    value: String,
}

impl FromStr for MeetingState {
    type Err = ParseMeetingStateError;

    fn from_str(s: &str) -> Result<Self, Self::Err> {
        match s {
            identifiers::APPOINTED => Ok(Self::Appointed),
            identifiers::INVITED => Ok(Self::Invited),
            identifiers::EXECUTED => Ok(Self::Executed),
            s => ParseMeetingStateSnafu {
                value: s.to_string(),
            }
            .fail(),
        }
    }
}