1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
use std::marker::PhantomData;

use serde::{Deserialize, Serialize};

use crate::{error::Error, Client};

#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct QualityResult {
    // Name of quality
    pub title: String,
}

/// A struct containing qualities results
#[derive(Deserialize, Debug, Clone)]
#[serde(untagged)]
enum QualityResponseUnion {
    Result(Vec<QualityResult>),
    Error { error: String },
}

#[derive(Serialize, Deserialize, Debug, Clone)]
pub enum QualitySort {
    #[serde(rename = "title")]
    Title,
    #[serde(rename = "count")]
    Count,
}

#[derive(Debug, Serialize, Clone)]
pub struct QualityQuery<'a>(PhantomData<&'a i32>);

impl<'a> QualityQuery<'a> {
    pub fn new() -> QualityQuery<'a> {
        QualityQuery(PhantomData)
    }

    /// Execute the query and fetch the results.
    pub async fn execute<'b>(&'a self, client: &'b Client) -> Result<Vec<QualityResult>, Error> {
        let body =
            comma_serde_urlencoded::to_string(self).map_err(Error::UrlencodedSerializeError)?;

        let response = client
            .init_post_request("/qualities")
            .body(body)
            .send()
            .await
            .map_err(Error::HttpError)?;

        let result = response
            .json::<QualityResponseUnion>()
            .await
            .map_err(Error::HttpError)?;

        match result {
            QualityResponseUnion::Result(result) => Ok(result),
            QualityResponseUnion::Error { error } => Err(Error::KodikError(error)),
        }
    }
}

impl<'a> Default for QualityQuery<'a> {
    fn default() -> Self {
        Self::new()
    }
}