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
use serde::{Deserialize, Serialize};

#[derive(Deserialize, Serialize, Debug, Clone)]
pub(crate) struct CaptchaResponse {
    pub(crate) status: u8,
    pub(crate) request: RequestContent,
    pub(crate) error_text: Option<String>,
}

/// Represents the possible data contained by the `request` field
/// that 2captcha returns
#[derive(Deserialize, Serialize, Debug, Clone)]
#[serde(untagged)]
pub enum RequestContent {
    String(String),
    GeetestResponse {
        #[serde(rename = "geetest_challenge")]
        challenge: String,

        #[serde(rename = "geetest_validate")]
        validate: String,

        #[serde(rename = "geetest_seccode")]
        seccode: String,
    },
    CapyResponse {
        #[serde(rename = "captchakey")]
        captcha_key: String,
        #[serde(rename = "challengekey")]
        challenge_key: String,
        answer: String,
    },
}

impl RequestContent {
    pub(crate) fn request_as_string(&self) -> String {
        if let RequestContent::String(data) = self {
            data.to_owned()
        } else {
            panic!()
        }
    }
}