// ============================================================
// JSON / JSONL
// ============================================================

///|
fn parse_json(s : String) -> Json raise ReaderError {
  @json.parse(s.view()) catch {
    e => raise ReaderError::Parse(e.to_string())
  }
}

///|
/// 解析 JSON 文件为动态值(Json)
pub fn read_json(
  file_path : String,
  encoding? : Encoding? = None,
) -> Json raise ReaderError {
  parse_json(read_txt(file_path, encoding~))
}

///|
/// 按块读取 JSON:假设顶层是数组,每 block_size 个元素一个块
pub fn read_json_by_block(
  file_path : String,
  block_size : Int,
  encoding? : Encoding? = None,
) -> Array[Array[Json]] raise ReaderError {
  let root = read_json(file_path, encoding~)
  let arr = match root {
    Array(a) => a
    _ => raise ReaderError::Parse("JSON 顶层不是数组")
  }
  let blocks : Array[Array[Json]] = []
  let mut cur : Array[Json] = []
  for v in arr {
    cur.push(v)
    if cur.length() == block_size {
      blocks.push(cur)
      cur = []
    }
  }
  if cur.length() > 0 {
    blocks.push(cur)
  }
  blocks
}

///|
/// 按行读取 JSONL(每行一个 JSON 对象)
pub fn read_jsonl_by_line(
  file_path : String,
  encoding? : Encoding? = None,
) -> Array[Json] raise ReaderError {
  let content = read_txt(file_path, encoding~)
  let result : Array[Json] = []
  for v in content.split("\n".view()) {
    let line = v.trim_end(chars="\r".view()).to_owned()
    if line != "" {
      result.push(parse_json(line))
    }
  }
  result
}