1use std::fs::read_to_string;
2use std::path::{Path, PathBuf};
3
4use alith_core::{
5 chunking::{ChunkError, Chunker, chunk_text},
6 knowledge::{FileKnowledge, Knowledge, KnowledgeError},
7};
8
9pub struct TextFileKnowledge {
10 pub path: PathBuf,
11}
12
13impl TextFileKnowledge {
14 pub fn new<P: AsRef<Path>>(path: P) -> Self {
15 Self {
16 path: path.as_ref().to_path_buf(),
17 }
18 }
19}
20
21impl Chunker for TextFileKnowledge {
22 fn chunk(&self) -> std::result::Result<Vec<String>, ChunkError> {
23 Ok(chunk_text(
24 &self
25 .load()
26 .map_err(|err| ChunkError::Normal(err.to_string()))?,
27 self.chunk_size() as u32,
28 self.overlap_percent(),
29 )
30 .map_err(|err| ChunkError::Normal(err.to_string()))?
31 .unwrap_or_default())
32 }
33}
34
35impl Knowledge for TextFileKnowledge {
36 fn load(&self) -> Result<String, KnowledgeError> {
37 Ok(read_to_string(&self.path)?)
38 }
39
40 fn enrich(&self, _input: &str) -> Result<String, KnowledgeError> {
41 Ok(format!("<textfile>{}</textfile>", self.load()?))
42 }
43}
44
45impl FileKnowledge for TextFileKnowledge {
46 fn load_with_path(&self) -> Result<(PathBuf, String), KnowledgeError> {
47 let content = self.load()?;
48 Ok((self.path.clone(), content))
49 }
50}