use std::fs;
use std::path::{Path, PathBuf};
use crate::config::config_dir;
use crate::db::models::sha256_hex;
use crate::error::Result;
pub const MAX_DB_CONTENT: usize = 2000;
pub fn content_dir() -> PathBuf {
config_dir().join("content")
}
pub fn store_content(content: &str) -> Result<(String, String)> {
let hash = sha256_hex(content);
let dir = content_dir();
fs::create_dir_all(&dir)?;
let abs = dir.join(&hash);
if !abs.exists() {
fs::write(&abs, content)?;
}
Ok((hash.clone(), format!("content/{}", hash)))
}
pub fn resolve_path(rel: &str) -> PathBuf {
config_dir().join(rel)
}
pub fn read_content(rel: &str) -> Result<String> {
Ok(fs::read_to_string(resolve_path(rel))?)
}
pub fn short_excerpt(content: &str, max: usize) -> String {
if content.chars().count() <= max {
return content.to_string();
}
let mut out: String = content.chars().take(max).collect();
out.push('…');
out
}
pub fn is_short(content: &str) -> bool {
content.len() <= MAX_DB_CONTENT
}
pub fn store_or_excerpt(content: &str) -> Result<(String, Option<String>)> {
if is_short(content) {
return Ok((content.to_string(), None));
}
let (_, rel) = store_content(content)?;
Ok((short_excerpt(content, MAX_DB_CONTENT), Some(rel)))
}
pub fn is_content_rel(path: &Path) -> bool {
path.starts_with("content")
}