Skip to content

Commit

Permalink
feat(config): Load config from Cargo.toml
Browse files Browse the repository at this point in the history
Fixes #1060
  • Loading branch information
epage committed Jul 25, 2024
1 parent 95f556a commit d5453cc
Showing 1 changed file with 48 additions and 4 deletions.
52 changes: 48 additions & 4 deletions crates/typos-cli/src/config.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,15 @@ use kstring::KString;

use crate::file_type_specifics;

pub const SUPPORTED_FILE_NAMES: &[&str] =
&["typos.toml", "_typos.toml", ".typos.toml", PYPROJECT_TOML];

pub const SUPPORTED_FILE_NAMES: &[&str] = &[
"typos.toml",
"_typos.toml",
".typos.toml",
CARGO_TOML,
PYPROJECT_TOML,
];

const CARGO_TOML: &str = "Cargo.toml";
const PYPROJECT_TOML: &str = "pyproject.toml";

#[derive(Debug, Clone, Default, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
Expand All @@ -22,6 +28,28 @@ pub struct Config {
pub overrides: EngineConfig,
}

#[derive(Debug, Clone, Default, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
#[serde(default)]
#[serde(rename_all = "kebab-case")]
pub struct CargoTomlConfig {
pub workspace: Option<CargoTomlPackage>,
pub package: Option<CargoTomlPackage>,
}

#[derive(Debug, Clone, Default, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
#[serde(default)]
#[serde(rename_all = "kebab-case")]
pub struct CargoTomlPackage {
pub metadata: CargoTomlMetadata,
}

#[derive(Debug, Clone, Default, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
#[serde(default)]
#[serde(rename_all = "kebab-case")]
pub struct CargoTomlMetadata {
pub typos: Option<Config>,
}

#[derive(Debug, Clone, Default, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
#[serde(default)]
#[serde(rename_all = "kebab-case")]
Expand Down Expand Up @@ -57,7 +85,23 @@ impl Config {
)
})?;

if path.file_name().unwrap() == PYPROJECT_TOML {
if path.file_name().unwrap() == CARGO_TOML {
let config = toml::from_str::<CargoTomlConfig>(&s)?;
let typos = config
.workspace
.and_then(|w| w.metadata.typos)
.or(config.package.and_then(|p| p.metadata.typos));

if let Some(typos) = typos {
Ok(Some(typos))
} else {
log::debug!(
"No `package.metadata.typos` section found in `{CARGO_TOML}`, skipping"
);

Ok(None)
}
} else if path.file_name().unwrap() == PYPROJECT_TOML {
let config = toml::from_str::<PyprojectTomlConfig>(&s)?;

if let Some(typos) = config.tool.typos {
Expand Down

0 comments on commit d5453cc

Please # to comment.