Skip to main content

adguardian/fetch/
fetch_filters.rs

1use 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}