use alloc::{borrow::Cow, vec::Vec};
use serde::Deserialize;
use super::{Author, Dependencies, ResolverVersion, RustEdition};
use crate::Table;
#[derive(Debug, Deserialize, Clone)]
pub struct Workspace<'p> {
#[serde(borrow)]
package: Option<Package<'p>>,
resolver: Option<ResolverVersion>,
dependencies: Option<Dependencies<'p>>,
members: Option<Vec<Cow<'p, str>>>,
#[serde(rename = "default-members")]
default_members: Option<Vec<Cow<'p, str>>>,
exclude: Option<Vec<Cow<'p, str>>>,
metadata: Option<Table<'p>>,
lints: Option<Table<'p>>,
}
impl<'p> Workspace<'p> {
pub fn package(&self) -> Option<&Package<'p>> {
self.package.as_ref()
}
pub fn resolver(&self) -> Option<ResolverVersion> {
self.resolver
}
pub fn dependencies(&self) -> Option<&Dependencies<'p>> {
self.dependencies.as_ref()
}
pub fn members(&self) -> Option<impl Iterator<Item = &str>> {
self.members.as_ref().map(|v| v.iter().map(|s| &**s))
}
pub fn default_members(&self) -> Option<impl Iterator<Item = &str>> {
self.default_members
.as_ref()
.map(|v| v.iter().map(|s| &**s))
}
pub fn exclude(&self) -> Option<impl Iterator<Item = &str>> {
self.exclude.as_ref().map(|v| v.iter().map(|s| &**s))
}
pub fn metadata(&self) -> Option<&Table<'p>> {
self.metadata.as_ref()
}
pub fn lints(&self) -> Option<&Table<'p>> {
self.lints.as_ref()
}
}
#[derive(Debug, Deserialize, Clone, PartialEq)]
pub struct Package<'p> {
#[serde(borrow)]
version: Option<Cow<'p, str>>,
edition: Option<RustEdition>,
#[serde(rename = "rust-version")]
rust_version: Option<Cow<'p, str>>,
authors: Option<Vec<Author<'p>>>,
description: Option<Cow<'p, str>>,
documentation: Option<Cow<'p, str>>,
readme: Option<Cow<'p, str>>,
homepage: Option<Cow<'p, str>>,
repository: Option<Cow<'p, str>>,
license: Option<Cow<'p, str>>,
license_file: Option<Cow<'p, str>>,
keywords: Option<Vec<Cow<'p, str>>>,
categories: Option<Vec<Cow<'p, str>>>,
publish: Option<bool>,
include: Option<Vec<Cow<'p, str>>>,
exclude: Option<Vec<Cow<'p, str>>>,
}
impl<'p> Package<'p> {
pub fn version(&self) -> Option<&str> {
self.version.as_deref()
}
pub fn edition(&self) -> Option<RustEdition> {
self.edition
}
pub fn rust_version(&self) -> Option<&str> {
self.rust_version.as_deref()
}
pub fn authors(&self) -> Option<&[Author<'p>]> {
self.authors.as_deref()
}
pub fn description(&self) -> Option<&str> {
self.description.as_deref()
}
pub fn documentation(&self) -> Option<&str> {
self.documentation.as_deref()
}
pub fn readme(&self) -> Option<&str> {
self.readme.as_deref()
}
pub fn homepage(&self) -> Option<&str> {
self.homepage.as_deref()
}
pub fn repository(&self) -> Option<&str> {
self.repository.as_deref()
}
pub fn license(&self) -> Option<&str> {
self.license.as_deref()
}
pub fn license_file(&self) -> Option<&str> {
self.license_file.as_deref()
}
pub fn keywords(&self) -> Option<impl Iterator<Item = &str>> {
self.keywords.as_ref().map(|v| v.iter().map(|s| &**s))
}
pub fn categories(&self) -> Option<impl Iterator<Item = &str>> {
self.categories.as_ref().map(|v| v.iter().map(|s| &**s))
}
pub fn publish(&self) -> Option<bool> {
self.publish
}
pub fn include(&self) -> Option<impl Iterator<Item = &str>> {
self.include.as_ref().map(|v| v.iter().map(|s| &**s))
}
pub fn exclude(&self) -> Option<impl Iterator<Item = &str>> {
self.exclude.as_ref().map(|v| v.iter().map(|s| &**s))
}
}