db.rs 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. use alloc::{string::String, vec::Vec};
  2. use crate::{
  3. c_str::CStr,
  4. fs::File,
  5. header::fcntl,
  6. io::{self, BufRead, BufReader},
  7. };
  8. pub enum Separator {
  9. Character(char),
  10. Whitespace,
  11. }
  12. pub struct Db<R: BufRead> {
  13. reader: R,
  14. separator: Separator,
  15. }
  16. impl<R: BufRead> Db<R> {
  17. pub fn new(reader: R, separator: Separator) -> Self {
  18. Db { reader, separator }
  19. }
  20. pub fn read(&mut self) -> io::Result<Option<Vec<String>>> {
  21. let mut line = String::new();
  22. if self.reader.read_line(&mut line)? == 0 {
  23. return Ok(None);
  24. }
  25. let vec = if let Some(not_comment) = line.trim().split('#').next() {
  26. match self.separator {
  27. Separator::Character(c) => not_comment.split(c).map(String::from).collect(),
  28. Separator::Whitespace => not_comment.split_whitespace().map(String::from).collect(),
  29. }
  30. } else {
  31. Vec::new()
  32. };
  33. Ok(Some(vec))
  34. }
  35. }
  36. pub type FileDb = Db<BufReader<File>>;
  37. impl FileDb {
  38. pub fn open(path: &CStr, separator: Separator) -> io::Result<Self> {
  39. let file = File::open(path, fcntl::O_RDONLY | fcntl::O_CLOEXEC)?;
  40. Ok(Db::new(BufReader::new(file), separator))
  41. }
  42. }