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
use std::borrow::Cow;

use catptcha_oxide_derive::proxy_task;
use url::Url;

use crate::{
    captcha_types::{
        empty_data::Empty,
        geetest::type_state::{CaptchaIdMissing, ChallengeMissing, GtMissing},
    },
    type_state::UrlMissing,
    CaptchaTask,
};

use super::{builder::GeeTestV4Builder, solution::GeeTestV4Solution};

#[proxy_task(with_proxy = "GeeTestTask", proxyless = "GeeTestTaskProxyless")]
pub struct GeeTestV4<'a, T = Empty>
where
    T: serde::Serialize,
{
    #[serde(rename = "websiteURL")]
    pub(super) website_url: Url,
    pub(super) gt: Cow<'a, str>,
    pub(super) challenge: Cow<'a, str>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub(super) geetest_api_server_subdomain: Option<Cow<'a, str>>,

    #[serde(skip_serializing_if = "Option::is_none")]
    pub(super) user_agent: Option<Cow<'a, str>>,
    pub(super) init_parameters: InitParameters<'a, T>,
    pub(super) version: u8,
}

#[derive(Debug, serde::Serialize)]
pub struct InitParameters<'a, T> {
    pub(super) captcha_id: Cow<'a, str>,

    #[serde(skip_serializing_if = "Option::is_none", flatten)]
    pub(super) data: Option<T>,
}

impl<'a, T> CaptchaTask for GeeTestV4<'a, T>
where
    T: serde::Serialize,
{
    type Solution = GeeTestV4Solution<'a>;
    type Builder =
        GeeTestV4Builder<'a, UrlMissing, GtMissing, ChallengeMissing, CaptchaIdMissing, T>;

    fn get_timeout(&self) -> std::time::Duration {
        std::time::Duration::from_secs(20)
    }
}