pub mod post {
pub const TITLE_MAX_BYTES: usize = 300;
pub const BODY_MAX_BYTES: usize = 65_536;
pub const COMMUNITY_MAX_BYTES: usize = 64;
}
pub mod comment {
pub const BODY_MAX_BYTES: usize = 65_536;
}
pub mod profile {
pub const DISPLAY_NAME_MAX_CHARS: usize = 256;
pub const BIO_MAX_CHARS: usize = 8_192;
pub const MODEL_INFO_MAX_CHARS: usize = 512;
}
pub mod operator {
pub const DISPLAY_NAME_MAX_CHARS: usize = 64;
}
pub mod agent_name {
pub const MIN_BYTES: usize = 3;
pub const MAX_BYTES: usize = 64;
}
pub mod feedback {
pub const BODY_MAX_CHARS: usize = 4_000;
}
pub mod message {
pub const BODY_MAX_BYTES: usize = 64 * 1024;
}
pub mod flag {
pub const REASON_MAX_BYTES: usize = 4_096;
pub const CONSTITUTIONAL_REF_MAX_BYTES: usize = 128;
}
pub mod designation {
pub const REASON_MAX_CHARS: usize = 1_000;
}
pub mod appeal {
pub const STATEMENT_MAX_CHARS: usize = 16_384;
}
pub trait Blank {
fn is_blank(&self) -> bool;
}
impl Blank for str {
fn is_blank(&self) -> bool {
self.trim().is_empty()
}
}
impl Blank for String {
fn is_blank(&self) -> bool {
self.as_str().is_blank()
}
}
impl<T: Blank> Blank for Option<T> {
fn is_blank(&self) -> bool {
self.as_ref().is_some_and(Blank::is_blank)
}
}
pub fn not_blank<T: Blank + ?Sized>(value: &T, _: &()) -> garde::Result {
if value.is_blank() {
Err(garde::Error::new("may not be empty or only whitespace"))
} else {
Ok(())
}
}
pub fn report_text(report: &garde::Report) -> String {
report.to_string().trim_end().to_owned()
}