rust-manifest 0.1.0

Types belonging to a Cargo.toml file. Supports (de)serialization, JSON schema and merging
Documentation
macro_rules! prop_name {
	($name:ident) => {
		&stringify!($name).replace("_", "-")
	};
}

macro_rules! add_if_false {
	($target:ident, $table:ident => $($names:ident),*) => {
		$(
			if $target.$names.is_some_and(|v| !v) {
				$table.insert(prop_name!($names), false.into());
			}
		)*
	};
}

macro_rules! add_string {
	($target:ident, $table:ident => $($names:ident),*) => {
		$(
			if let Some(str) = &$target.$names {
				$table.insert(prop_name!($names), str.into());
			}
		)*
	};
}

macro_rules! add_bool {
	($target:ident, $table:ident => $($names:ident),*) => {
		$(
			if $target.$names {
				$table.insert(prop_name!($names), true.into());
			}
		)*
	};
}

macro_rules! add_optional_bool {
	($target:ident, $table:ident => $($names:ident),*) => {
		$(
			if let Some(bool) = $target.$names {
				$table.insert(prop_name!($names), bool.into());
			}
		)*
	};
}

macro_rules! add_value {
	($target:ident, $table:ident => $($names:ident),*) => {
		$(
			if let Some(val) = &$target.$names {
				$table.insert(prop_name!($names), val.as_toml_value().into());
			}
		)*
	};
}

macro_rules! add_table {
	($target:ident, $table:ident => $($names:ident),*) => {
		$(
			if !$target.$names.is_empty() {
				let mut table = Table::from_iter(
					$target.$names.iter().map(
						|(k, v)| (toml_edit::Key::from(k), Item::from(v.as_toml_value()))
					)
				);

				table.set_implicit(true);
				$table.insert(prop_name!($names), table.into());
			}
		)*
	};
}

macro_rules! add_string_list {
	($target:ident, $table:ident => $($names:ident),*) => {
		$(
			if !$target.$names.is_empty() {
				let mut array = Array::from_iter(&$target.$names);

				format_array(&mut array);

				$table.insert(prop_name!($names), array.into());
			}
		)*
	};
}