vn-core 0.11.1

VNDB for Rust
Documentation
mod json;
mod url;

use crate::model::QueryField;
use itertools::Itertools;
pub use json::{JsonQuery, JsonQueryBuilder, JsonQueryFilter};
use std::collections::HashSet;
use std::marker::PhantomData;
pub use url::UrlQueryParams;

#[derive(Clone, Debug)]
pub struct FieldSet<T: QueryField> {
  inner: HashSet<String>,
  marker: PhantomData<T>,
}

impl<T: QueryField> FieldSet<T> {
  pub const URL_QUERY_PARAM: &'static str = "fields";

  pub fn from_raw<I>(iter: I) -> Self
  where
    I: IntoIterator<Item = String>,
  {
    Self {
      inner: iter.into_iter().collect(),
      marker: PhantomData,
    }
  }

  pub fn with_capacity(capacity: usize) -> Self {
    Self {
      inner: HashSet::with_capacity(capacity),
      marker: PhantomData,
    }
  }

  pub fn extend<I>(&mut self, iter: I)
  where
    I: IntoIterator<Item = T>,
  {
    self.inner.extend(
      iter
        .into_iter()
        .map(|field| field.to_string()),
    );
  }

  pub fn extend_raw<I>(&mut self, iter: I)
  where
    I: IntoIterator<Item = String>,
  {
    self.inner.extend(iter);
  }

  pub fn insert(&mut self, field: &T) {
    self.inner.insert(field.to_string());
  }

  pub fn insert_raw(&mut self, field: &str) {
    self.inner.insert(field.to_string());
  }

  pub fn into_url_query(self) -> UrlQueryParams {
    UrlQueryParams(vec![(Self::URL_QUERY_PARAM, self.join())])
  }

  pub fn is_empty(&self) -> bool {
    self.inner.is_empty()
  }

  pub fn join(self) -> String {
    self.inner.iter().join(",")
  }

  pub fn remove(&mut self, field: &T) -> bool {
    self.inner.remove(&field.to_string())
  }

  pub fn reserve(&mut self, additional: usize) {
    self.inner.reserve(additional);
  }

  pub fn shrink_to_fit(&mut self) {
    self.inner.shrink_to_fit();
  }
}

impl<T: QueryField> Default for FieldSet<T> {
  fn default() -> Self {
    Self {
      inner: HashSet::new(),
      marker: PhantomData,
    }
  }
}