umami-api 0.0.2

Easily interact with the Umami API (self-hosted instances)
Documentation
use serde::Deserialize;

use crate::{Umami, UmamiError, websites::WebsiteWithUserTeam};

#[derive(Clone, Debug, Deserialize)]
struct OriginalResponse {
  data: Vec<WebsiteWithUserTeam>,
}

pub struct GetWebsitesRequestBuilder<'a> {
  client: &'a Umami,
  search: Option<String>,
  page: Option<u32>,
  page_size: Option<u32>,
}

impl<'a> GetWebsitesRequestBuilder<'a> {
  pub fn new(client: &'a Umami) -> Self {
    Self { client, search: None, page: None, page_size: None }
  }

  /// Search text
  pub fn search(mut self, search: impl Into<String>) -> Self {
    self.search = Some(search.into());
    self
  }

  /// Determines page
  pub fn page(mut self, page: impl Into<u32>) -> Self {
    self.page_size = Some(page.into());
    self
  }

  /// Determines how many results to return
  pub fn page_size(mut self, page_size: impl Into<u32>) -> Self {
    self.page_size = Some(page_size.into());
    self
  }

  pub async fn fetch(self) -> Result<Vec<WebsiteWithUserTeam>, UmamiError> {
    let mut parameters: Vec<(&str, String)> = vec![];

    if let Some(search) = self.search {
      parameters.extend(vec![("search", search)]);
    }
    if let Some(page) = self.page {
      parameters.extend(vec![("page", page.to_string())]);
    }
    if let Some(page_size) = self.page_size {
      parameters.extend(vec![("pageSize", page_size.to_string())]);
    }

    let response = self.client.request::<OriginalResponse, _>("get", "admin/websites", parameters).await?;
    Ok(response.data)
  }
}