use crate::error::{BrowserError, Result};
pub const MAX_SEMANTIC_COMPONENTS: usize = 10_000;
pub const MAX_SEMANTIC_DEPTH: usize = 64;
pub const MAX_SEMANTIC_STRING_CHARS: usize = 4_096;
pub const MAX_SEMANTIC_SELECT_OPTIONS: usize = 256;
pub const MAX_SEMANTIC_TOTAL_TEXT_CHARS: usize = 1_000_000;
pub(crate) fn validate_semantic_string(field: &str, value: &str) -> Result<()> {
let char_count = value.chars().count();
if char_count > MAX_SEMANTIC_STRING_CHARS {
return Err(BrowserError::resource_limit_exceeded(
"semantic_string_chars",
format!(
"semantic field {field} is {char_count} characters, exceeding the {MAX_SEMANTIC_STRING_CHARS} character limit"
),
format!("{MAX_SEMANTIC_STRING_CHARS} characters"),
format!("{char_count} characters"),
));
}
Ok(())
}
pub(crate) fn validate_component_count(count: usize) -> Result<()> {
if count > MAX_SEMANTIC_COMPONENTS {
return Err(BrowserError::resource_limit_exceeded(
"semantic_components",
format!(
"semantic document has {count} components, exceeding the {MAX_SEMANTIC_COMPONENTS} component limit"
),
format!("{MAX_SEMANTIC_COMPONENTS} components"),
format!("{count} components"),
));
}
Ok(())
}
pub(crate) fn validate_depth(depth: usize) -> Result<()> {
if depth > MAX_SEMANTIC_DEPTH {
return Err(BrowserError::resource_limit_exceeded(
"semantic_depth",
format!(
"semantic document depth is {depth}, exceeding the {MAX_SEMANTIC_DEPTH} depth limit"
),
format!("{MAX_SEMANTIC_DEPTH}"),
format!("{depth}"),
));
}
Ok(())
}
pub(crate) fn validate_total_text_chars(total: usize) -> Result<()> {
if total > MAX_SEMANTIC_TOTAL_TEXT_CHARS {
return Err(BrowserError::resource_limit_exceeded(
"semantic_total_text_chars",
format!(
"semantic document text is {total} characters, exceeding the {MAX_SEMANTIC_TOTAL_TEXT_CHARS} character limit"
),
format!("{MAX_SEMANTIC_TOTAL_TEXT_CHARS} characters"),
format!("{total} characters"),
));
}
Ok(())
}