use std::path::PathBuf;
use crate::audit::AuditConfig;
use crate::notifications::NotificationConfig;
use crate::policy::match_tree::CompiledPolicy;
mod discovery;
mod env;
mod loader;
pub use discovery::{
DEFAULT_POLICY_TEMPLATE, PolicyLevel, SANDBOX_PRESETS, SandboxPreset,
compile_default_policy_to_json, compile_default_policy_to_json_with_preset,
evaluate_policy_file, evaluate_star_policy, parse_notification_config, policy_file,
project_policy_file, session_policy_file, settings_dir,
};
pub use env::{CLASH_DISABLE_ENV, CLASH_PASSTHROUGH_ENV, is_disabled, is_passthrough};
#[derive(Debug, Clone, Default)]
pub struct HookContext {
pub transcript_dir: Option<String>,
}
impl HookContext {
pub fn from_transcript_path(transcript_path: &str) -> Self {
let transcript_dir = if transcript_path.is_empty() {
None
} else {
std::path::Path::new(transcript_path)
.parent()
.map(|p| p.to_string_lossy().to_string())
.filter(|s| !s.is_empty())
};
Self { transcript_dir }
}
}
#[derive(Debug, Clone)]
pub struct LoadedPolicy {
pub level: PolicyLevel,
pub path: PathBuf,
pub source: String,
}
#[derive(Debug, Default)]
pub struct ClashSettings {
compiled: Option<CompiledPolicy>,
loaded_policies: Vec<LoadedPolicy>,
pub notifications: NotificationConfig,
pub notification_warning: Option<String>,
pub audit: AuditConfig,
policy_error: Option<String>,
}