adguardian/fetch/
fetch_filters.rs1use base64::{engine::general_purpose::STANDARD, Engine as _};
2use reqwest::{header::HeaderMap, Client, Response};
3use serde::Deserialize;
4
5#[derive(Deserialize)]
6pub struct AdGuardFilteringStatus {
7 pub filters: Option<Vec<Filter>>,
8}
9
10#[derive(Deserialize)]
11pub struct Filter {
12 pub name: String,
13 pub rules_count: u32,
14 pub enabled: bool,
15}
16
17pub async fn fetch_adguard_filter_list(
18 client: &Client,
19 endpoint: &str,
20 username: &str,
21 password: &str,
22) -> Result<AdGuardFilteringStatus, anyhow::Error> {
23 let url = format!("{}/control/filtering/status", endpoint);
24
25 let auth_string = format!("{}:{}", username, password);
26 let auth_header_value = format!("Basic {}", STANDARD.encode(&auth_string));
27 let mut headers = HeaderMap::new();
28 headers.insert("Authorization", auth_header_value.parse()?);
29
30 let res: Response = client.get(&url).headers(headers).send().await?;
31 if !res.status().is_success() {
32 return Err(anyhow::anyhow!(
33 "Request failed with status code {}",
34 res.status()
35 ));
36 }
37 let status: AdGuardFilteringStatus = res.json().await?;
38
39 Ok(status)
40}