use crate::{CoreDistributionInformation, UserDistributionID};
use std::{convert::TryFrom, fmt::Display};
use thiserror::Error;
#[derive(Debug, Clone, Copy)]
pub enum DistributionID {
System,
User(UserDistributionID),
}
#[derive(Debug, Error)]
#[error("Cannot convert System distribution to UserDistribution.")]
pub struct ConversionError;
impl TryFrom<DistributionID> for UserDistributionID {
type Error = ConversionError;
#[inline]
fn try_from(value: DistributionID) -> Result<Self, Self::Error> {
match value {
DistributionID::User(id) => Ok(id),
DistributionID::System => Err(ConversionError),
}
}
}
impl From<UserDistributionID> for DistributionID {
#[inline]
fn from(value: UserDistributionID) -> Self {
Self::User(value)
}
}
impl<T: CoreDistributionInformation> From<T> for DistributionID {
#[inline]
fn from(value: T) -> Self {
value.id().into()
}
}
impl From<Option<UserDistributionID>> for DistributionID {
#[inline]
fn from(value: Option<UserDistributionID>) -> Self {
value.map_or(Self::System, Self::User)
}
}
impl From<DistributionID> for Option<UserDistributionID> {
#[inline]
fn from(value: DistributionID) -> Self {
match value {
DistributionID::System => None,
DistributionID::User(id) => Some(id),
}
}
}
impl Display for DistributionID {
#[inline]
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Self::System => f.write_str("System"),
Self::User(id) => std::fmt::Display::fmt(id, f),
}
}
}