blz_core/
json_builder.rs

1//! Helper utilities for building blz-core JSON structures.
2
3use chrono::Utc;
4
5use crate::{FileInfo, LineIndex, LlmsJson, ParseMeta, ParseResult, Source};
6
7/// Build a `LlmsJson` structure from parse results and metadata.
8///
9/// This helper constructs the complete JSON structure that gets saved
10/// to disk for each source, containing TOC, line index, and metadata.
11#[must_use]
12pub fn build_llms_json(
13    alias: &str,
14    url: &str,
15    file_name: &str,
16    sha256: String,
17    etag: Option<String>,
18    last_modified: Option<String>,
19    parse_result: &ParseResult,
20) -> LlmsJson {
21    LlmsJson {
22        source: alias.to_string(),
23        metadata: Source {
24            url: url.to_string(),
25            etag,
26            last_modified,
27            fetched_at: Utc::now(),
28            sha256: sha256.clone(),
29            variant: crate::SourceVariant::Llms, // Default, caller can override.
30            aliases: Vec::new(),
31            tags: Vec::new(),
32            description: None,
33            category: None,
34            npm_aliases: Vec::new(),
35            github_aliases: Vec::new(),
36            origin: crate::SourceOrigin {
37                manifest: None,
38                source_type: Some(crate::SourceType::Remote {
39                    url: url.to_string(),
40                }),
41            },
42            filter_non_english: None,
43        },
44        filter_stats: None,
45        toc: parse_result.toc.clone(),
46        files: vec![FileInfo {
47            path: file_name.to_string(),
48            sha256,
49        }],
50        line_index: LineIndex {
51            total_lines: parse_result.line_count,
52            byte_offsets: false,
53        },
54        diagnostics: parse_result.diagnostics.clone(),
55        parse_meta: Some(ParseMeta {
56            parser_version: 1,
57            segmentation: "structured".to_string(),
58        }),
59    }
60}