1#![recursion_limit = "256"]
8
9mod audit;
10mod cli;
11mod mcp;
12mod opencode;
13mod review;
14mod tools;
15
16pub(crate) use cli::{config, ui};
17
18#[derive(Debug, Clone, Copy, PartialEq, Eq)]
19pub(crate) enum TextDecodeError {
20 Binary,
21 NonUtf8,
22}
23
24pub(crate) fn decode_utf8(raw: Vec<u8>) -> Result<String, TextDecodeError> {
25 if raw.contains(&0) {
26 return Err(TextDecodeError::Binary);
27 }
28 String::from_utf8(raw).map_err(|_| TextDecodeError::NonUtf8)
29}
30
31pub async fn run(argv: Vec<String>) -> anyhow::Result<i32> {
33 cli::app::run(argv).await
34}
35
36pub fn err_line(args: std::fmt::Arguments<'_>) {
38 ui::err_line(args);
39}