framesmith 0.1.0

A Rust library for controlling Samsung Frame TVs over the local network
Documentation
use std::collections::VecDeque;
use std::sync::Mutex;

use crate::Error;
use crate::frame_tv_transport::FrameTvTransport;
use crate::protocol::art_response::ArtResponse;

pub(crate) struct MockTransport {
    art_responses: Mutex<VecDeque<Result<ArtResponse, Error>>>,
    remote_key_log: Mutex<Vec<String>>,
    upload_responses: Mutex<VecDeque<Result<ArtResponse, Error>>>,
    thumbnail_responses: Mutex<VecDeque<Result<Vec<u8>, Error>>>,
    display_size: (u32, u32),
}

impl MockTransport {
    pub fn new() -> Self {
        Self {
            art_responses: Mutex::new(VecDeque::new()),
            remote_key_log: Mutex::new(Vec::new()),
            upload_responses: Mutex::new(VecDeque::new()),
            thumbnail_responses: Mutex::new(VecDeque::new()),
            display_size: (3840, 2160),
        }
    }

    pub fn enqueue_art_response(&self, resp: ArtResponse) {
        self.art_responses.lock().unwrap().push_back(Ok(resp));
    }

    pub fn enqueue_art_error(&self, err: Error) {
        self.art_responses.lock().unwrap().push_back(Err(err));
    }

    pub fn enqueue_upload_response(&self, resp: ArtResponse) {
        self.upload_responses.lock().unwrap().push_back(Ok(resp));
    }

    pub fn enqueue_thumbnail_response(&self, data: Vec<u8>) {
        self.thumbnail_responses.lock().unwrap().push_back(Ok(data));
    }

    pub fn get_remote_key_log(&self) -> Vec<String> {
        self.remote_key_log.lock().unwrap().clone()
    }
}

impl FrameTvTransport for MockTransport {
    async fn send_art_request(
        &self,
        _request_json: &str,
        _wait_for_event: Option<&str>,
    ) -> Result<ArtResponse, Error> {
        self.art_responses
            .lock()
            .unwrap()
            .pop_front()
            .unwrap_or(Err(Error::ConnectionFailed(
                "no mock response queued".into(),
            )))
    }

    async fn send_remote_key(&self, key_code: &str) -> Result<(), Error> {
        self.remote_key_log
            .lock()
            .unwrap()
            .push(key_code.to_string());
        Ok(())
    }

    async fn upload_image(
        &self,
        _image_data: &[u8],
        _file_type: &str,
        _matte_id: Option<&str>,
    ) -> Result<ArtResponse, Error> {
        self.upload_responses
            .lock()
            .unwrap()
            .pop_front()
            .unwrap_or(Err(Error::ConnectionFailed(
                "no mock upload response queued".into(),
            )))
    }

    async fn download_thumbnail(&self, _content_id: &str) -> Result<Vec<u8>, Error> {
        self.thumbnail_responses
            .lock()
            .unwrap()
            .pop_front()
            .unwrap_or(Err(Error::ConnectionFailed(
                "no mock thumbnail response queued".into(),
            )))
    }

    async fn tv_display_size(&self) -> Result<(u32, u32), Error> {
        Ok(self.display_size)
    }
}