#![warn(missing_docs)]
#![recursion_limit = "256"]
#![cfg_attr(
test,
allow(clippy::expect_used, clippy::unwrap_in_result, clippy::unwrap_used)
)]
use sha2::{Digest, Sha256};
pub mod compaction;
pub mod composite;
pub mod config;
pub mod error;
pub mod git;
pub mod http;
pub mod lock;
pub mod mcp;
pub mod models;
pub mod parser;
pub mod pool;
pub mod service;
pub mod storage;
pub use config::ServerConfig;
pub use error::{AppError, AppResult};
pub use http::CoverageServer;
pub use storage::{CoverageStore, ProjectSettings, ProjectSettingsPatch};
pub(crate) fn stable_project_id(repo_key: &str) -> String {
let digest = Sha256::digest(repo_key.as_bytes());
hex_prefix(&digest, 12)
}
pub(crate) fn hex_prefix(bytes: &[u8], max_bytes: usize) -> String {
const HEX: &[u8; 16] = b"0123456789abcdef";
let mut encoded = String::with_capacity(bytes.len().min(max_bytes) * 2);
for &byte in bytes.iter().take(max_bytes) {
encoded.push(HEX[(byte >> 4) as usize] as char);
encoded.push(HEX[(byte & 0x0f) as usize] as char);
}
encoded
}
#[cfg(test)]
extern crate self as coverage_mcp;
#[cfg(test)]
#[path = "../tests/rust_migration.rs"]
mod rust_migration;
pub const SCHEMA_REVISION: u32 = 16;
pub const VERSION: &str = env!("CARGO_PKG_VERSION");