plex-api 0.0.12

Library for communication with Plex server. Work in progress, not ready for any use. See github for details.
Documentation
use crate::{
    media_container::home::{User, UsersResponse},
    url::{MYPLEX_USERS, MYPLEX_USER_SWITCH},
    HttpClient, MyPlex, Result,
};

use super::account::MyPlexAccount;

pub struct HomeManager {
    pub(crate) client: HttpClient,
}

#[derive(Debug, Clone)]
pub enum SwitchableUser {
    UserUuid(String),
    UserId(u64),
}

impl SwitchableUser {
    pub fn id(&self) -> String {
        match self {
            SwitchableUser::UserUuid(uuid) => uuid.to_owned(),
            SwitchableUser::UserId(id) => id.to_string(),
        }
    }
}

impl From<User> for SwitchableUser {
    fn from(val: User) -> Self {
        SwitchableUser::UserUuid(val.uuid)
    }
}

impl From<&User> for SwitchableUser {
    fn from(val: &User) -> Self {
        SwitchableUser::UserUuid(val.uuid.clone())
    }
}

impl From<String> for SwitchableUser {
    fn from(val: String) -> Self {
        SwitchableUser::UserUuid(val)
    }
}

impl From<&str> for SwitchableUser {
    fn from(val: &str) -> Self {
        SwitchableUser::UserUuid(val.to_owned())
    }
}

impl From<u64> for SwitchableUser {
    fn from(val: u64) -> Self {
        SwitchableUser::UserId(val)
    }
}

impl HomeManager {
    pub async fn users(&self) -> Result<Vec<User>> {
        Ok(self
            .client
            .get(MYPLEX_USERS)
            .xml::<UsersResponse>()
            .await?
            .users)
    }

    pub async fn switch_user(
        &self,
        myplex: MyPlex,
        user: impl Into<SwitchableUser>,
        pin: Option<&str>,
    ) -> Result<MyPlex> {
        let mut myplex = myplex;
        let account: MyPlexAccount = self
            .client
            .post(format!(
                "{}?pin={}",
                MYPLEX_USER_SWITCH.replace("{uuid}", &user.into().id()),
                pin.unwrap_or_default()
            ))
            .json()
            .await?;
        myplex.client = myplex.client.set_x_plex_token(account.auth_token.clone());
        myplex.account = Some(account);

        Ok(myplex)
    }
}