Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 2 additions & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ rpl_mir_graph = { path = "./crates/rpl_mir_graph" }
rpl_mir_transform = { path = "./crates/rpl_mir_transform" }
rpl_utils = { path = "./crates/rpl_utils" }
rpl_meta = { path = "./crates/rpl_meta" }
rpl_config = { path = "./crates/rpl_config" }
rpl_constraints = { path = "./crates/rpl_constraints" }
rpl_resolve = { path = "./crates/rpl_resolve" }
rustc_tools_util = "0.3.0"
Expand Down Expand Up @@ -90,6 +91,7 @@ path = "src/driver.rs"
[dependencies]
rpl_interface.workspace = true
rpl_meta.workspace = true
rpl_config.workspace = true
rustc_tools_util.workspace = true
color-print = "0.3.4"
anstream = "0.6.0"
Expand Down
15 changes: 15 additions & 0 deletions crates/rpl_config/Cargo.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
[package]
name = "rpl_config"
version.workspace = true
description.workspace = true
repository.workspace = true
license.workspace = true
keywords.workspace = true
edition.workspace = true

[dependencies]
cargo_metadata = "0.15.4"
serde.workspace = true
serde_json.workspace = true
toml.workspace = true
thiserror.workspace = true
74 changes: 74 additions & 0 deletions crates/rpl_config/src/lib.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
use std::path::{Path, PathBuf};

use serde::Deserialize;

mod patterns;
mod run;
mod util;

#[derive(Debug, thiserror::Error)]
pub enum ConfigError {
#[error("failed to read {path}: {source}")]
Io { path: PathBuf, source: Box<std::io::Error> },
#[error("failed to parse {path}: {source}")]
Toml {
path: PathBuf,
source: Box<toml::de::Error>,
},
#[error("cargo metadata failed: {0}")]
CargoMetadata(#[from] Box<cargo_metadata::Error>),
#[error("rpl.toml not found at {path}")]
ConfigNotFound { path: PathBuf },
#[error("rpl.toml defines no pattern groups")]
NoGroups,
#[error("duplicate pattern group name `{name}`")]
DuplicateGroup { name: String },
#[error("unknown pattern group `{name}`")]
UnknownGroup { name: String },
#[error("invalid remote group reference `{spec}`; expected `crate::group`")]
InvalidRemoteGroup { spec: String },
#[error("crate `{crate_name}` not found in cargo metadata")]
CrateNotFound { crate_name: String },
#[error("multiple crates named `{crate_name}` found; disambiguation not supported")]
AmbiguousCrate { crate_name: String },
#[error("crate `{crate_name}` does not publish RPL metadata")]
MissingRplMetadata { crate_name: String },
#[error("crate `{crate_name}` has invalid RPL metadata: {error}")]
InvalidRplMetadata { crate_name: String, error: String },
#[error("crate `{crate_name}` does not define RPL group `{group}`")]
MissingRemoteGroup { crate_name: String, group: String },
#[error("pattern group name cannot be empty")]
EmptyGroupName,
#[error("pattern path is not valid unicode: {path}")]
NonUnicodePath { path: PathBuf },
#[error("pattern paths cannot be joined for environment variable: {source}")]
InvalidPatternPathList { source: Box<std::env::JoinPathsError> },
}

#[derive(Debug, Deserialize)]
struct RplConfig {
run: Option<run::RunConfig>,
patterns: Option<patterns::PatternsConfig>,
}

#[derive(Debug)]
pub struct Config {
pub patterns_env: Option<String>,
pub inline_mir: Option<bool>,
}

pub fn load_config(manifest_path: Option<&Path>, selected_groups: &[String]) -> Result<Config, ConfigError> {
let base_dir = util::resolve_base_dir(manifest_path)?;
let config_path = base_dir.join("rpl.toml");
let config = if config_path.exists() {
Some(util::read_config(&config_path)?)
} else {
None
};
let inline_mir = run::load_inline_mir(config.as_ref());
let patterns_env = patterns::load_patterns_env(manifest_path, selected_groups, config.as_ref())?;
Ok(Config {
patterns_env,
inline_mir,
})
}
Loading