1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
// use crate::node::Node;
// use anyhow::Context;
// use encoding::{DecoderTrap, Encoding};
// use std::fs::File;
// use std::jupiter-io::{BufRead, BufReader, Lines};
// use std::str::CharIndices;
//
// enum RangeSpec {
//     Plain(usize, usize),
//     Trim(usize, usize),
//     Join(Vec<(usize, usize)>),
//     TrimJoin(Vec<(usize, usize)>),
//     TrimJoinBlank(Vec<(usize, usize)>),
// }
//
// pub struct Range {
//     name: String,
//     spec: RangeSpec,
// }
//
// pub struct Nodes<R> {
//     // lines: Lines<>,
//     encoding: Box<dyn Encoding>
// }
//
// impl Iterator<> for Nodes<R> {
//     type Item = Node;
//
//     fn next(&mut self) -> Option<Node> {
//
//         unimplemented!()
//     }
// }
//
//
//
// pub fn parse(
//     filename: &str,
//     encoding: &dyn Encoding,
//     ranges: Vec<Range>) -> Iterator<Node> {
//     let file = File::open(filename).context("Failed to open file")?;
//     let mut reader = BufReader::new(file);
//     // reader.lines().map(|line| encoding.decode())
//     let mut buffer = Vec::with_capacity(8192);
//
//     let mut line_number = 1;
//     while let Ok(length) = reader.read_until(b'\n', &mut buffer) {
//         if buffer.last().map(|b| b == &b'\r').unwrap_or(false) {
//             buffer.remove(buffer.len() - 1);
//         }
// buffer.lines().
//         let line = match encoding.decode(&buffer[..], DecoderTrap::Strict) {
//             Ok(line) => line,
//             Err(error) => {
//                 return Err(anyhow::anyhow!(
//                     "Encoding error in line {}: {}",
//                     line_number,
//                     error
//                 ));
//             }
//         };
//
//         let chars = line.char_indices();
//         let mut result = Node::object();
//         for range in ranges.iter() {
//             let value = extract_range(&range.spec, &chars);
//             result.put(range.name.as_str(), Node::String(value));
//         }
//
//         buffer.clear();
//         line_number += 1;
//     }
//
//     Ok(())
// }
//
// fn extract_range(spec: &RangeSpec, chars: &CharIndices) -> String {
//     match spec {
//         RangeSpec::Plain(from, to) => sub_string(*from, *to, chars),
//         RangeSpec::Trim(from, to) => sub_string(*from, *to, chars).trim().to_owned(),
//         RangeSpec::Join(ranges) => {
//             let mut result = String::new();
//             for range in ranges.iter() {
//                 result.push_str(sub_string(range.0, range.1, chars).as_str());
//             }
//
//             result
//         }
//         RangeSpec::TrimJoin(ranges) => {
//             let mut result = String::new();
//             for range in ranges.iter() {
//                 result.push_str(sub_string(range.0, range.1, chars).trim());
//             }
//
//             result
//         }
//         RangeSpec::TrimJoinBlank(ranges) => {
//             let mut result = String::new();
//             for range in ranges.iter() {
//                 if !result.is_empty() {
//                     result.push_str(" ");
//                 }
//                 result.push_str(sub_string(range.0, range.1, chars).trim());
//             }
//
//             result
//         }
//     }
// }
//
// fn sub_string(from: usize, to: usize, chars: &CharIndices, line: String) -> &str {
//     let start = chars.skip(from).next()?.0;
//     let end = chars.take(to - from - 1).next()?.0;
//
//     &line[start..=end]
// }