modrinth-api 2.7.1

A client library for the Modrinth API, generated with openapi-generator
Documentation
use std::error;
use std::fmt;

use reqwest::header::InvalidHeaderValue;

#[derive(Debug, Clone)]
pub struct ResponseContent<T> {
  pub status: reqwest::StatusCode,
  pub content: String,
  pub entity: Option<T>,
}

#[derive(Debug)]
pub enum Error<T> {
  Reqwest(reqwest::Error),
  Serde(serde_json::Error),
  Io(std::io::Error),
  ResponseError(ResponseContent<T>),
  InvalidHeaderValue(InvalidHeaderValue),
}

impl<T> fmt::Display for Error<T> {
  fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
    let (module, e) = match self {
      Error::Reqwest(e) => ("reqwest", e.to_string()),
      Error::Serde(e) => ("serde", e.to_string()),
      Error::Io(e) => ("IO", e.to_string()),
      Error::ResponseError(e) => ("response", format!("status code {}", e.status)),
      Error::InvalidHeaderValue(e) => ("http", e.to_string()),
    };
    write!(f, "error in {}: {}", module, e)
  }
}

impl<T: fmt::Debug> error::Error for Error<T> {
  fn source(&self) -> Option<&(dyn error::Error + 'static)> {
    Some(match self {
      Error::Reqwest(e) => e,
      Error::Serde(e) => e,
      Error::Io(e) => e,
      Error::ResponseError(_) => return None,
      Error::InvalidHeaderValue(e) => e,
    })
  }
}

impl<T> From<reqwest::Error> for Error<T> {
  fn from(e: reqwest::Error) -> Self {
    Error::Reqwest(e)
  }
}

impl<T> From<serde_json::Error> for Error<T> {
  fn from(e: serde_json::Error) -> Self {
    Error::Serde(e)
  }
}

impl<T> From<std::io::Error> for Error<T> {
  fn from(e: std::io::Error) -> Self {
    Error::Io(e)
  }
}

pub fn urlencode<T: AsRef<str>>(s: T) -> String {
  ::url::form_urlencoded::byte_serialize(s.as_ref().as_bytes()).collect()
}

pub fn parse_deep_object(prefix: &str, value: &serde_json::Value) -> Vec<(String, String)> {
  if let serde_json::Value::Object(object) = value {
    let mut params = vec![];

    for (key, value) in object {
      match value {
        serde_json::Value::Object(_) => params.append(&mut parse_deep_object(
          &format!("{}[{}]", prefix, key),
          value,
        )),
        serde_json::Value::Array(array) => {
          for (i, value) in array.iter().enumerate() {
            params.append(&mut parse_deep_object(
              &format!("{}[{}][{}]", prefix, key, i),
              value,
            ));
          }
        }
        serde_json::Value::String(s) => params.push((format!("{}[{}]", prefix, key), s.clone())),
        _ => params.push((format!("{}[{}]", prefix, key), value.to_string())),
      }
    }

    return params;
  }

  unimplemented!("Only objects are supported with style=deepObject")
}

pub mod misc_api;
pub mod notifications_api;
pub mod projects_api;
pub mod tags_api;
pub mod teams_api;
pub mod threads_api;
pub mod users_api;
pub mod version_files_api;
pub mod versions_api;

pub mod configuration;