use std::{
collections::HashMap,
fmt::{Debug, Display},
path::PathBuf,
};
use serde::{Deserialize, Serialize};
use serde_json::Value;
mod config;
pub use config::{Features, MetadataConfig};
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct Metadata {
pub packages: Vec<Package>,
pub workspace_members: Vec<String>, pub resolve: Option<Resolve>,
pub target_directory: PathBuf,
pub version: usize,
pub workspace_root: PathBuf,
#[serde(rename = "metadata")]
pub workspace_metadata: Option<Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct Package {
pub name: String,
pub version: String,
pub id: String, pub license: Option<String>, pub license_file: Option<String>,
pub description: Option<String>,
pub source: Option<String>, pub dependencies: Vec<Dependency>, pub targets: Vec<Target>,
pub features: HashMap<String, Vec<String>>,
pub manifest_path: PathBuf,
#[serde(rename = "metadata")]
pub package_metadata: Option<Value>,
pub publish: Publishing, pub authors: Vec<String>,
pub categories: Vec<String>,
pub default_run: Option<String>,
pub rust_version: Option<String>,
pub keywords: Vec<String>,
pub readme: Option<String>,
pub repository: Option<String>,
pub homepage: Option<String>,
pub documentation: Option<String>,
pub edition: Edition,
pub links: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
#[serde(transparent)]
pub struct Publishing(Option<Vec<String>>);
impl Publishing {
pub fn restrictions(&self) -> PublishingRestrictions {
if let Some(ref registries) = self.0 {
if registries.is_empty() {
PublishingRestrictions::Forbidden
} else {
PublishingRestrictions::Registries(registries)
}
} else {
PublishingRestrictions::Unrestricted
}
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum PublishingRestrictions<'a> {
Unrestricted,
Forbidden,
Registries(&'a Vec<String>),
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct Dependency {
pub name: String,
pub source: Option<String>,
pub req: String,
pub kind: Option<String>, pub rename: Option<String>,
pub optional: bool,
pub uses_default_features: bool,
pub features: Vec<String>,
pub target: Option<String>, pub path: Option<PathBuf>,
pub registry: Option<String>, }
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct Target {
pub kind: Vec<TargetKind>,
pub crate_types: Vec<String>, pub name: String,
pub src_path: PathBuf,
pub edition: Edition,
#[serde(rename = "required-features")]
pub required_features: Option<Vec<String>>,
pub doc: bool,
pub doctest: bool,
pub test: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub enum TargetKind {
#[serde(rename = "bin")]
Bin,
#[serde(rename = "lib")]
Lib,
#[serde(rename = "rlib")]
Rlib,
#[serde(rename = "dylib")]
Dylib,
#[serde(rename = "cdylib")]
Cdylib,
#[serde(rename = "staticlib")]
Staticlib,
#[serde(rename = "proc-macro")]
ProcMacro,
#[serde(rename = "example")]
Example,
#[serde(rename = "test")]
Test,
#[serde(rename = "bench")]
Bench,
#[serde(rename = "custom-build")]
CustomBuild,
}
#[derive(Clone, Serialize, Deserialize, PartialEq, Eq)]
pub enum Edition {
#[serde(rename = "2015")]
E2015,
#[serde(rename = "2018")]
E2018,
#[serde(rename = "2021")]
E2021,
}
impl Debug for Edition {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Self::E2015 => write!(f, "2015"),
Self::E2018 => write!(f, "2018"),
Self::E2021 => write!(f, "2021"),
}
}
}
impl Display for Edition {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Self::E2015 => write!(f, "2015"),
Self::E2018 => write!(f, "2018"),
Self::E2021 => write!(f, "2021"),
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct Resolve {}