Skip to main content

headson/
lib.rs

1#![doc = include_str!("../README.md")]
2#![deny(
3    clippy::unwrap_used,
4    clippy::expect_used,
5    clippy::print_stdout,
6    clippy::print_stderr
7)]
8#![allow(
9    clippy::multiple_crate_versions,
10    reason = "Dependency graph pulls distinct versions (e.g., yaml-rust2)."
11)]
12#![cfg_attr(
13    test,
14    allow(
15        clippy::unwrap_used,
16        clippy::expect_used,
17        reason = "tests may use unwrap/expect for brevity"
18    )
19)]
20
21use anyhow::Result;
22
23pub mod budget;
24mod debug;
25mod grep;
26mod ingest;
27mod order;
28mod pruner;
29mod serialization;
30mod utils;
31pub use grep::{
32    GrepConfig, GrepPatterns, GrepShow, build_grep_config,
33    build_grep_config_from_patterns, combine_patterns,
34};
35pub use ingest::fileset::{FilesetInput, FilesetInputKind};
36pub use ingest::format::Format;
37pub use order::types::{ArrayBias, ArraySamplerStrategy};
38pub use order::{
39    NodeId, NodeKind, PriorityConfig, PriorityOrder, RankedNode, build_order,
40};
41pub use utils::extensions;
42pub use utils::templates::map_json_template_for_style;
43
44pub use pruner::budget::find_largest_render_under_budgets;
45pub use prunist::{Budget, BudgetKind, Budgets};
46pub use serialization::color::resolve_color_enabled;
47pub use serialization::types::{
48    ColorMode, ColorStrategy, OutputTemplate, RenderConfig, Style,
49};
50
51#[derive(Debug)]
52pub struct RenderOutput {
53    pub text: String,
54    pub warnings: Vec<String>,
55}
56
57#[derive(Copy, Clone, Debug)]
58pub enum TextMode {
59    Plain,
60    CodeLike,
61}
62
63pub enum InputKind {
64    Json(Vec<u8>),
65    Jsonl(Vec<u8>),
66    Yaml(Vec<u8>),
67    Text { bytes: Vec<u8>, mode: TextMode },
68    Fileset(Vec<FilesetInput>),
69}
70
71pub fn headson(
72    input: InputKind,
73    config: &RenderConfig,
74    priority_cfg: &PriorityConfig,
75    grep: &GrepConfig,
76    budgets: Budgets,
77) -> Result<RenderOutput> {
78    let crate::ingest::IngestOutput { arena, warnings } =
79        crate::ingest::ingest_into_arena(input, priority_cfg, grep)?;
80    let mut order_build = order::build_order(&arena, priority_cfg)?;
81    let out = find_largest_render_under_budgets(
82        &mut order_build,
83        config,
84        grep,
85        budgets,
86    );
87    Ok(RenderOutput {
88        text: out,
89        warnings,
90    })
91}