librespot_metadata/
availability.rs

1use std::{
2    fmt::Debug,
3    ops::{Deref, DerefMut},
4};
5
6use thiserror::Error;
7
8use crate::util::{impl_deref_wrapped, impl_try_from_repeated};
9
10use librespot_core::date::Date;
11
12use librespot_protocol as protocol;
13use protocol::metadata::Availability as AvailabilityMessage;
14
15pub type AudioItemAvailability = Result<(), UnavailabilityReason>;
16
17#[derive(Debug, Clone)]
18pub struct Availability {
19    pub catalogue_strs: Vec<String>,
20    pub start: Date,
21}
22
23#[derive(Debug, Clone, Default)]
24pub struct Availabilities(pub Vec<Availability>);
25
26impl_deref_wrapped!(Availabilities, Vec<Availability>);
27
28#[derive(Debug, Copy, Clone, Error)]
29pub enum UnavailabilityReason {
30    #[error("blacklist present and country on it")]
31    Blacklisted,
32    #[error("available date is in the future")]
33    Embargo,
34    #[error("required data was not present")]
35    NoData,
36    #[error("whitelist present and country not on it")]
37    NotWhitelisted,
38}
39
40impl TryFrom<&AvailabilityMessage> for Availability {
41    type Error = librespot_core::Error;
42    fn try_from(availability: &AvailabilityMessage) -> Result<Self, Self::Error> {
43        Ok(Self {
44            catalogue_strs: availability.catalogue_str.to_vec(),
45            start: availability.start.get_or_default().try_into()?,
46        })
47    }
48}
49
50impl_try_from_repeated!(AvailabilityMessage, Availabilities);