use std::io::Write;
use std::path::Path;
use anyhow::Result;
use toml::Value;
use crate::config;
use crate::config::site::{Refusal, SiteConfig, SiteConfigError};
pub(super) fn write_site_section<W: Write>(
out: &mut W,
path: &Path,
loaded: &Result<Option<SiteConfig>, SiteConfigError>,
refusal: &Result<Option<Refusal>, SiteConfigError>,
) -> Result<()> {
writeln!(out)?;
writeln!(out, "Site policy:")?;
match loaded {
Ok(None) => writeln!(out, " none - no policy file at {}", path.display())?,
Ok(Some(site)) => {
writeln!(out, " in effect from {}", path.display())?;
match site.max_concurrent_ceiling {
Some(ceiling) => writeln!(out, " max_concurrent ceiling: {ceiling}")?,
None => writeln!(out, " no max_concurrent ceiling")?,
}
write_markers(out, site, refusal)?;
}
Err(err) => writeln!(out, " {err}")?,
}
Ok(())
}
fn write_markers<W: Write>(
out: &mut W,
site: &SiteConfig,
refusal: &Result<Option<Refusal>, SiteConfigError>,
) -> Result<()> {
if site.refuse_markers.is_empty() {
return writeln!(out, " no refuse_markers").map_err(Into::into);
}
writeln!(out, " refuse_markers: {}", site.refuse_markers.join(", "))?;
match refusal {
Ok(Some(refusal)) => writeln!(
out,
" semantic review is refused here: {} is present",
refusal.marker.display()
)?,
Ok(None) => writeln!(out, " none of those files is here, so review runs")?,
Err(err) => writeln!(out, " {err}")?,
}
Ok(())
}
pub(super) fn clamp_note(entry: &Value, site: Option<&SiteConfig>) -> Option<String> {
let requested = entry_max_concurrent(entry);
let clamped = site?.clamp_concurrency(requested);
(clamped < requested).then(|| {
format!("max_concurrent: {requested} lowered to {clamped} by the site policy ceiling")
})
}
fn entry_max_concurrent(entry: &Value) -> usize {
entry
.get("max_concurrent")
.and_then(Value::as_integer)
.and_then(|value| usize::try_from(value).ok())
.unwrap_or_else(|| config::LlmConfig::default().max_concurrent)
}