dynasty-api 1.1.0

Dynasty Reader's wrappers
Documentation
use serde::{Deserialize, Serialize};

use crate::{directory::DirectoryKind, DynastyReaderRoute, DYNASTY_READER_BASE};

/// A configuration to get a [SearchSuggestion]
#[allow(missing_docs)]
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct SearchSuggestionConfig {
    pub query: String,
}

impl From<String> for SearchSuggestionConfig {
    fn from(s: String) -> Self {
        SearchSuggestionConfig { query: s }
    }
}

impl DynastyReaderRoute for SearchSuggestionConfig {
    fn request_builder(
        &self,
        client: &reqwest::Client,
        url: reqwest::Url,
    ) -> reqwest::RequestBuilder {
        client.post(url).form(&[("query", &self.query)])
    }

    fn request_url(&self) -> reqwest::Url {
        DYNASTY_READER_BASE.join("tags/suggest").unwrap()
    }
}

/// A Dynasty Reader's search suggestion
///
/// You can convert this into a [super::SearchTag]
#[allow(missing_docs)]
#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize)]
pub struct SearchSuggestion {
    pub id: u64,
    pub name: String,
    #[serde(alias = "type")]
    pub kind: DirectoryKind,
}

#[cfg(test)]
mod tests {
    use anyhow::Result;

    use crate::test_utils::tryhard_configs;

    #[tokio::test]
    #[ignore = "requires internet"]
    async fn response_structure() -> Result<()> {
        let configs = ["hin", "nio", "yagat", "ayano", "scum"].map(|s| s.to_string().into());

        tryhard_configs(configs, |client, config| client.search_suggestions(config)).await?;

        Ok(())
    }
}