From 20a3aabae5e2802ec8098848116cebf168151a21 Mon Sep 17 00:00:00 2001 From: Adrian Bienkowski Date: Mon, 20 Jul 2026 12:21:31 -0400 Subject: [PATCH] fix: gracefully handle missing config directory in all three languages --- go/internal/policy/manager.go | 5 +++++ rs/src/policy.rs | 9 ++++++++- ts/src/policy.ts | 12 +++++++++++- 3 files changed, 24 insertions(+), 2 deletions(-) diff --git a/go/internal/policy/manager.go b/go/internal/policy/manager.go index befbc42..91b004b 100644 --- a/go/internal/policy/manager.go +++ b/go/internal/policy/manager.go @@ -2,6 +2,7 @@ package policy import ( "fmt" + "log/slog" "os" "path/filepath" "strings" @@ -22,6 +23,10 @@ func NewManager(configDir string) (*Manager, error) { entries, err := os.ReadDir(configDir) if err != nil { + if os.IsNotExist(err) { + slog.Warn("config dir not found, starting with empty policy set", "dir", configDir) + return m, nil + } return nil, fmt.Errorf("failed to read config directory %s: %w", configDir, err) } diff --git a/rs/src/policy.rs b/rs/src/policy.rs index ebea8d8..392bf3e 100644 --- a/rs/src/policy.rs +++ b/rs/src/policy.rs @@ -55,7 +55,14 @@ impl Manager { pub fn new(config_dir: &str) -> Result> { let mut policies_by_name = HashMap::new(); - let entries = std::fs::read_dir(config_dir)?; + let entries = match std::fs::read_dir(config_dir) { + Ok(d) => d, + Err(e) if e.kind() == std::io::ErrorKind::NotFound => { + eprintln!("warn: config dir {} not found, starting with empty policy set", config_dir); + return Ok(Manager { policies_by_name }); + } + Err(e) => return Err(e.into()), + }; for entry in entries { let entry = entry?; diff --git a/ts/src/policy.ts b/ts/src/policy.ts index df4e2f7..4551dab 100644 --- a/ts/src/policy.ts +++ b/ts/src/policy.ts @@ -42,7 +42,17 @@ export class Manager { private policiesByName = new Map(); constructor(configDir: string) { - const entries = readdirSync(configDir); + let entries: string[]; + try { + entries = readdirSync(configDir); + } catch (err: any) { + if (err.code === "ENOENT") { + console.warn(`warn: config dir ${configDir} not found, starting with empty policy set`); + entries = []; + } else { + throw err; + } + } for (const entry of entries) { if (!entry.endsWith(".yaml") && !entry.endsWith(".yml")) continue;