use serde::{Deserialize, Serialize};
fn deserialize_name<'de, D>(
deserializer: D,
) -> Result<Option<String>, D::Error>
where
D: serde::Deserializer<'de>,
{
let name = String::deserialize(deserializer)?;
Ok(Some(name.trim_matches('"').to_string()))
}
#[derive(
Clone,
Debug,
Default,
Deserialize,
Eq,
Hash,
Ord,
PartialEq,
PartialOrd,
Serialize,
)]
pub struct FileGenerationParams {
pub author: Option<String>,
pub build: Option<String>,
pub categories: Option<String>,
pub description: Option<String>,
pub documentation: Option<String>,
pub edition: Option<String>,
pub email: Option<String>,
pub homepage: Option<String>,
pub keywords: Option<String>,
pub license: Option<String>,
#[serde(deserialize_with = "deserialize_name")]
pub name: Option<String>,
pub output: Option<String>,
pub readme: Option<String>,
#[serde(deserialize_with = "deserialize_name")]
pub repository: Option<String>,
pub rustversion: Option<String>,
pub version: Option<String>,
pub website: Option<String>,
}
impl FileGenerationParams {
pub fn default_params() -> Self {
Self {
author: Some("John Smith".to_string()),
build: Some("build.rs".to_string()),
categories: Some(
"[\"category1\",\"category2\",\"category3\"]"
.to_string(),
),
description: Some(
"A Rust library for doing cool things".to_string(),
),
documentation: Some(
"https://docs.rs/my_library".to_string(),
),
edition: Some("2021".to_string()),
email: Some("john.smith@example.com".to_string()),
homepage: Some("https://my_library.rs".to_string()),
keywords: Some(
"[\"rust\",\"library\",\"cool\"]".to_string(),
),
license: Some("MIT".to_string()),
name: Some("my_library".to_string()),
output: Some("my_library".to_string()),
readme: Some("README.md".to_string()),
repository: Some(
"https://github.com/example/my_library".to_string(),
),
rustversion: Some("1.60".to_string()),
version: Some("0.1.0".to_string()),
website: Some("https://example.com/john-smith".to_string()),
}
}
pub fn new() -> Self {
Self::default_params()
}
pub fn from_args(args_str: &str) -> Result<Self, String> {
let mut params = Self::new();
let args: Vec<&str> = args_str.split_whitespace().collect();
for arg in args {
let mut arg_parts = arg.splitn(2, ' ');
let arg_name = arg_parts
.next()
.ok_or_else(|| "Missing argument name".to_string())?;
let arg_value = arg_parts
.next()
.ok_or_else(|| "Missing argument value".to_string())?;
match arg_name {
"--author" => {
params.author = Some(arg_value.to_string());
}
"--build" => params.build = Some(arg_value.to_string()),
"--categories" => {
params.categories = Some(arg_value.to_string());
}
"--description" => {
params.description = Some(arg_value.to_string());
}
"--documentation" => {
params.documentation = Some(arg_value.to_string());
}
"--edition" => {
params.edition = Some(arg_value.to_string());
}
"--email" => params.email = Some(arg_value.to_string()),
"--homepage" => {
params.homepage = Some(arg_value.to_string());
}
"--keywords" => {
params.keywords = Some(arg_value.to_string());
}
"--license" => {
params.license = Some(arg_value.to_string());
}
"--name" => params.name = Some(arg_value.to_string()),
"--output" => {
params.output = Some(arg_value.to_string());
}
"--readme" => {
params.readme = Some(arg_value.to_string());
}
"--repository" => {
params.repository = Some(arg_value.to_string());
}
"--rustversion" => {
params.rustversion = Some(arg_value.to_string());
}
"--version" => {
params.version = Some(arg_value.to_string());
}
"--website" => {
params.website = Some(arg_value.to_string());
}
_ => (),
}
}
Ok(params)
}
}