pub struct BoundaryConfig {
pub preset: Option<BoundaryPreset>,
pub zones: Vec<BoundaryZone>,
pub rules: Vec<BoundaryRule>,
}Expand description
Architecture boundary configuration.
Defines zones (directory groupings) and rules (which zones may import from which). Optionally uses a built-in preset as a starting point.
§Examples
use fallow_config::BoundaryConfig;
let json = r#"{
"zones": [
{ "name": "ui", "patterns": ["src/components/**"] },
{ "name": "db", "patterns": ["src/db/**"] }
],
"rules": [
{ "from": "ui", "allow": ["db"] }
]
}"#;
let config: BoundaryConfig = serde_json::from_str(json).unwrap();
assert_eq!(config.zones.len(), 2);
assert_eq!(config.rules.len(), 1);Using a preset:
use fallow_config::BoundaryConfig;
let json = r#"{ "preset": "layered" }"#;
let mut config: BoundaryConfig = serde_json::from_str(json).unwrap();
config.expand("src");
assert_eq!(config.zones.len(), 4);
assert_eq!(config.rules.len(), 4);Fields§
§preset: Option<BoundaryPreset>Built-in architecture preset. When set, expands into default zones and rules.
User-defined zones and rules merge on top: zones with the same name replace
the preset zone; rules with the same from replace the preset rule.
Preset patterns use {rootDir}/{zone}/** where rootDir is auto-detected
from tsconfig.json (falls back to src).
Note: preset patterns are flat (src/<zone>/**). For monorepos with
per-package source directories, define zones explicitly instead.
zones: Vec<BoundaryZone>Named zones mapping directory patterns to architectural layers.
rules: Vec<BoundaryRule>Import rules between zones. A zone with a rule entry can only import from the listed zones (plus itself). A zone without a rule entry is unrestricted.
Implementations§
Source§impl BoundaryConfig
impl BoundaryConfig
Sourcepub fn expand(&mut self, source_root: &str)
pub fn expand(&mut self, source_root: &str)
Expand the preset (if set) into zones and rules, merging user overrides on top.
source_root is the directory prefix for preset zone patterns (e.g., "src").
After expansion, self.preset is cleared and all zones/rules are explicit.
Merge semantics:
- User zones with the same name as a preset zone replace the preset zone entirely.
- User rules with the same
fromas a preset rule replace the preset rule. - User zones/rules with new names add to the preset set.
Sourcepub fn expand_auto_discover(&mut self, project_root: &Path) -> Vec<LogicalGroup>
pub fn expand_auto_discover(&mut self, project_root: &Path) -> Vec<LogicalGroup>
Expand auto-discovered boundary groups into concrete child zones.
A zone with autoDiscover: ["src/features"] discovers the immediate
child directories below src/features and emits child zones named
zone_name/child. Rules that reference the logical parent are expanded
to all discovered children. If the parent also has explicit patterns,
it is kept after the children as a fallback so child directories remain
isolated by first-match classification. The parent fallback rule
automatically allows its discovered children so top-level barrels can
re-export child modules without relaxing sibling isolation on the child
rules.
Returns one LogicalGroup per pre-expansion zone that carried a
non-empty autoDiscover, in user-declaration order. The caller (the
resolution pipeline) stashes the result onto
ResolvedBoundaryConfig::logical_groups for fallow list --boundaries --format json to render. Discarding the return is fine
for callers that only need the expansion side effect (classification);
the data is regenerated on the next run.
Duplicate parent zone name behavior: when two BoundaryZone
declarations share a name and both carry autoDiscover, their
discovered children merge into a single LogicalGroup whose
auto_discover concatenates both source path lists in declaration
order. This mirrors the existing rule-side merge behavior (both rules
expand to the same union of child names). A tracing::warn! surfaces
the duplicate at config-load time so the user can deduplicate the
source; the merged behavior is a soft default rather than a hard
rejection so existing configs continue to load.
Source§impl BoundaryConfig
impl BoundaryConfig
Sourcepub fn preset_name(&self) -> Option<&str>
pub fn preset_name(&self) -> Option<&str>
Return the preset name if one is configured but not yet expanded.
Sourcepub fn validate_root_prefixes(&self) -> Vec<RedundantRootPrefix>
pub fn validate_root_prefixes(&self) -> Vec<RedundantRootPrefix>
Validate that no zone’s pattern redundantly includes its root
prefix. Patterns are resolved relative to the zone root, so prefixing
the pattern with the same root double-prefixes the path and never
matches.
The rendered diagnostic carries the legacy
FALLOW-BOUNDARY-ROOT-REDUNDANT-PREFIX tag via
ZoneValidationError’s Display impl, so CI logs grepping for the
old text continue to work.
Sourcepub fn validate_zone_references(&self) -> Vec<UnknownZoneRef>
pub fn validate_zone_references(&self) -> Vec<UnknownZoneRef>
Validate that all zone names referenced in rules are defined in zones.
Walks every zone-reference surface on BoundaryRule: from, allow,
and allow_type_only. An unknown zone in allow_type_only silently
behaves as “not allowed” at runtime, so it MUST surface here for parity
with the existing allow-side diagnostic.
Sourcepub fn resolve(&self) -> ResolvedBoundaryConfig
pub fn resolve(&self) -> ResolvedBoundaryConfig
Resolve into compiled form with pre-built glob matchers.
User patterns were validated at config load time
(see FallowConfig::validate_user_globs).
Trait Implementations§
Source§impl Clone for BoundaryConfig
impl Clone for BoundaryConfig
Source§fn clone(&self) -> BoundaryConfig
fn clone(&self) -> BoundaryConfig
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl Debug for BoundaryConfig
impl Debug for BoundaryConfig
Source§impl Default for BoundaryConfig
impl Default for BoundaryConfig
Source§fn default() -> BoundaryConfig
fn default() -> BoundaryConfig
Source§impl<'de> Deserialize<'de> for BoundaryConfig
impl<'de> Deserialize<'de> for BoundaryConfig
Source§fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
Source§impl JsonSchema for BoundaryConfig
impl JsonSchema for BoundaryConfig
Source§fn schema_id() -> Cow<'static, str>
fn schema_id() -> Cow<'static, str>
Source§fn json_schema(generator: &mut SchemaGenerator) -> Schema
fn json_schema(generator: &mut SchemaGenerator) -> Schema
Source§fn inline_schema() -> bool
fn inline_schema() -> bool
$ref keyword. Read moreAuto Trait Implementations§
impl Freeze for BoundaryConfig
impl RefUnwindSafe for BoundaryConfig
impl Send for BoundaryConfig
impl Sync for BoundaryConfig
impl Unpin for BoundaryConfig
impl UnsafeUnpin for BoundaryConfig
impl UnwindSafe for BoundaryConfig
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<D> OwoColorize for D
impl<D> OwoColorize for D
Source§fn fg<C>(&self) -> FgColorDisplay<'_, C, Self>where
C: Color,
fn fg<C>(&self) -> FgColorDisplay<'_, C, Self>where
C: Color,
Source§fn bg<C>(&self) -> BgColorDisplay<'_, C, Self>where
C: Color,
fn bg<C>(&self) -> BgColorDisplay<'_, C, Self>where
C: Color,
Source§fn black(&self) -> FgColorDisplay<'_, Black, Self>
fn black(&self) -> FgColorDisplay<'_, Black, Self>
Source§fn on_black(&self) -> BgColorDisplay<'_, Black, Self>
fn on_black(&self) -> BgColorDisplay<'_, Black, Self>
Source§fn red(&self) -> FgColorDisplay<'_, Red, Self>
fn red(&self) -> FgColorDisplay<'_, Red, Self>
Source§fn on_red(&self) -> BgColorDisplay<'_, Red, Self>
fn on_red(&self) -> BgColorDisplay<'_, Red, Self>
Source§fn green(&self) -> FgColorDisplay<'_, Green, Self>
fn green(&self) -> FgColorDisplay<'_, Green, Self>
Source§fn on_green(&self) -> BgColorDisplay<'_, Green, Self>
fn on_green(&self) -> BgColorDisplay<'_, Green, Self>
Source§fn yellow(&self) -> FgColorDisplay<'_, Yellow, Self>
fn yellow(&self) -> FgColorDisplay<'_, Yellow, Self>
Source§fn on_yellow(&self) -> BgColorDisplay<'_, Yellow, Self>
fn on_yellow(&self) -> BgColorDisplay<'_, Yellow, Self>
Source§fn blue(&self) -> FgColorDisplay<'_, Blue, Self>
fn blue(&self) -> FgColorDisplay<'_, Blue, Self>
Source§fn on_blue(&self) -> BgColorDisplay<'_, Blue, Self>
fn on_blue(&self) -> BgColorDisplay<'_, Blue, Self>
Source§fn magenta(&self) -> FgColorDisplay<'_, Magenta, Self>
fn magenta(&self) -> FgColorDisplay<'_, Magenta, Self>
Source§fn on_magenta(&self) -> BgColorDisplay<'_, Magenta, Self>
fn on_magenta(&self) -> BgColorDisplay<'_, Magenta, Self>
Source§fn purple(&self) -> FgColorDisplay<'_, Magenta, Self>
fn purple(&self) -> FgColorDisplay<'_, Magenta, Self>
Source§fn on_purple(&self) -> BgColorDisplay<'_, Magenta, Self>
fn on_purple(&self) -> BgColorDisplay<'_, Magenta, Self>
Source§fn cyan(&self) -> FgColorDisplay<'_, Cyan, Self>
fn cyan(&self) -> FgColorDisplay<'_, Cyan, Self>
Source§fn on_cyan(&self) -> BgColorDisplay<'_, Cyan, Self>
fn on_cyan(&self) -> BgColorDisplay<'_, Cyan, Self>
Source§fn white(&self) -> FgColorDisplay<'_, White, Self>
fn white(&self) -> FgColorDisplay<'_, White, Self>
Source§fn on_white(&self) -> BgColorDisplay<'_, White, Self>
fn on_white(&self) -> BgColorDisplay<'_, White, Self>
Source§fn default_color(&self) -> FgColorDisplay<'_, Default, Self>
fn default_color(&self) -> FgColorDisplay<'_, Default, Self>
Source§fn on_default_color(&self) -> BgColorDisplay<'_, Default, Self>
fn on_default_color(&self) -> BgColorDisplay<'_, Default, Self>
Source§fn bright_black(&self) -> FgColorDisplay<'_, BrightBlack, Self>
fn bright_black(&self) -> FgColorDisplay<'_, BrightBlack, Self>
Source§fn on_bright_black(&self) -> BgColorDisplay<'_, BrightBlack, Self>
fn on_bright_black(&self) -> BgColorDisplay<'_, BrightBlack, Self>
Source§fn bright_red(&self) -> FgColorDisplay<'_, BrightRed, Self>
fn bright_red(&self) -> FgColorDisplay<'_, BrightRed, Self>
Source§fn on_bright_red(&self) -> BgColorDisplay<'_, BrightRed, Self>
fn on_bright_red(&self) -> BgColorDisplay<'_, BrightRed, Self>
Source§fn bright_green(&self) -> FgColorDisplay<'_, BrightGreen, Self>
fn bright_green(&self) -> FgColorDisplay<'_, BrightGreen, Self>
Source§fn on_bright_green(&self) -> BgColorDisplay<'_, BrightGreen, Self>
fn on_bright_green(&self) -> BgColorDisplay<'_, BrightGreen, Self>
Source§fn bright_yellow(&self) -> FgColorDisplay<'_, BrightYellow, Self>
fn bright_yellow(&self) -> FgColorDisplay<'_, BrightYellow, Self>
Source§fn on_bright_yellow(&self) -> BgColorDisplay<'_, BrightYellow, Self>
fn on_bright_yellow(&self) -> BgColorDisplay<'_, BrightYellow, Self>
Source§fn bright_blue(&self) -> FgColorDisplay<'_, BrightBlue, Self>
fn bright_blue(&self) -> FgColorDisplay<'_, BrightBlue, Self>
Source§fn on_bright_blue(&self) -> BgColorDisplay<'_, BrightBlue, Self>
fn on_bright_blue(&self) -> BgColorDisplay<'_, BrightBlue, Self>
Source§fn bright_magenta(&self) -> FgColorDisplay<'_, BrightMagenta, Self>
fn bright_magenta(&self) -> FgColorDisplay<'_, BrightMagenta, Self>
Source§fn on_bright_magenta(&self) -> BgColorDisplay<'_, BrightMagenta, Self>
fn on_bright_magenta(&self) -> BgColorDisplay<'_, BrightMagenta, Self>
Source§fn bright_purple(&self) -> FgColorDisplay<'_, BrightMagenta, Self>
fn bright_purple(&self) -> FgColorDisplay<'_, BrightMagenta, Self>
Source§fn on_bright_purple(&self) -> BgColorDisplay<'_, BrightMagenta, Self>
fn on_bright_purple(&self) -> BgColorDisplay<'_, BrightMagenta, Self>
Source§fn bright_cyan(&self) -> FgColorDisplay<'_, BrightCyan, Self>
fn bright_cyan(&self) -> FgColorDisplay<'_, BrightCyan, Self>
Source§fn on_bright_cyan(&self) -> BgColorDisplay<'_, BrightCyan, Self>
fn on_bright_cyan(&self) -> BgColorDisplay<'_, BrightCyan, Self>
Source§fn bright_white(&self) -> FgColorDisplay<'_, BrightWhite, Self>
fn bright_white(&self) -> FgColorDisplay<'_, BrightWhite, Self>
Source§fn on_bright_white(&self) -> BgColorDisplay<'_, BrightWhite, Self>
fn on_bright_white(&self) -> BgColorDisplay<'_, BrightWhite, Self>
Source§fn bold(&self) -> BoldDisplay<'_, Self>
fn bold(&self) -> BoldDisplay<'_, Self>
Source§fn dimmed(&self) -> DimDisplay<'_, Self>
fn dimmed(&self) -> DimDisplay<'_, Self>
Source§fn italic(&self) -> ItalicDisplay<'_, Self>
fn italic(&self) -> ItalicDisplay<'_, Self>
Source§fn underline(&self) -> UnderlineDisplay<'_, Self>
fn underline(&self) -> UnderlineDisplay<'_, Self>
Source§fn blink(&self) -> BlinkDisplay<'_, Self>
fn blink(&self) -> BlinkDisplay<'_, Self>
Source§fn blink_fast(&self) -> BlinkFastDisplay<'_, Self>
fn blink_fast(&self) -> BlinkFastDisplay<'_, Self>
Source§fn reversed(&self) -> ReversedDisplay<'_, Self>
fn reversed(&self) -> ReversedDisplay<'_, Self>
Source§fn strikethrough(&self) -> StrikeThroughDisplay<'_, Self>
fn strikethrough(&self) -> StrikeThroughDisplay<'_, Self>
Source§fn color<Color>(&self, color: Color) -> FgDynColorDisplay<'_, Color, Self>where
Color: DynColor,
fn color<Color>(&self, color: Color) -> FgDynColorDisplay<'_, Color, Self>where
Color: DynColor,
OwoColorize::fg or
a color-specific method, such as OwoColorize::green, Read moreSource§fn on_color<Color>(&self, color: Color) -> BgDynColorDisplay<'_, Color, Self>where
Color: DynColor,
fn on_color<Color>(&self, color: Color) -> BgDynColorDisplay<'_, Color, Self>where
Color: DynColor,
OwoColorize::bg or
a color-specific method, such as OwoColorize::on_yellow, Read more