seamapi-rs 0.1.1

A Rust client for Seam
Documentation
use anyhow::{bail, Context, Result};
use serde::{Deserialize, Serialize};
use serde_json::Value;

pub struct ConnectWebviews(pub String, pub String);

#[derive(Serialize, Deserialize, Clone, Debug)]
pub struct ConnectWebview {
    pub connect_webview_id: String,
    pub custom_redirect_url: Value,
    pub url: String,
    pub workspace_id: String,
    pub device_selection_mode: String,
    pub accepted_provider: Option<Vec<String>>,
    pub accepted_devices: Vec<Value>,
    pub any_provider_allowed: bool,
    pub any_device_allowed: Value,
    pub created_at: String,
    pub login_successful: bool,
    pub status: String,
}

impl ConnectWebviews {
    pub fn list(self) -> Result<Vec<ConnectWebview>> {
        let url = format!("{}/connect_webviews/list", self.1);
        let header = format!("Bearer {}", self.0);

        let req = reqwest::blocking::Client::new()
            .get(url)
            .header("Authorization", header)
            .send()
            .context("Failed to send get request")?;

        if req.status() != reqwest::StatusCode::OK {
            bail!("{}", req.text().context("Text error")?);
        }
        let json: crate::Response = req.json().context("failed to deserialize JSON")?;
        Ok(json.connect_webviews.unwrap())
    }

    pub fn get(self, connect_webview_id: String) -> Result<ConnectWebview> {
        let url = format!(
            "{}/connect_webview/get?connect_webview_id={}",
            self.1, connect_webview_id
        );
        let header = format!("Bearer {}", self.0);

        let req = reqwest::blocking::Client::new()
            .get(url)
            .header("Authorization", header)
            .send()
            .context("Failed to send get request")?;

        if req.status() == reqwest::StatusCode::NOT_FOUND {
            bail!("webview not found");
        } else if req.status() != reqwest::StatusCode::OK {
            bail!("{}", req.text().context("Really bad API failure")?)
        }

        let json: crate::Response = req.json().context("Failed to deserialize JSON")?;
        Ok(json.connect_webview.unwrap())
    }

    pub fn create(
        self,
        accepted_provider: Vec<String>,
        custom_redirect_url: Option<String>,
        device_selection_mode: Option<String>,
    ) -> Result<ConnectWebview> {
        let url = format!("{}/connect_webviews/create", self.1);
        let header = format!("Bearer {}", self.0);

        let mut map = std::collections::HashMap::new();
        map.insert("accepted_providers", accepted_provider);
        let mut map2 = std::collections::HashMap::new();
        if custom_redirect_url != None {
            map2.insert("custom_redirect_url", custom_redirect_url.unwrap());
        }
        if device_selection_mode != None {
            let d = device_selection_mode.unwrap();
            if d == "none".to_string() || d == "single".to_string() || d == "multiple".to_string() {
                map2.insert("device_selection_mode", d);
            }
        }

        let req = reqwest::blocking::Client::new()
            .post(url)
            .header("Authorization", header)
            .json(&map)
            .send()
            .context("Failed to send post request")?;

        if req.status() != reqwest::StatusCode::OK {
            bail!("{}", req.text().context("Really bad API failure")?);
        }

        let json: crate::Response = req.json().context("Failed to deserialize JSON")?;
        Ok(json.connect_webview.unwrap())
    }
}