rsjsonnet-front 0.5.0

A Jsonnet front end (source loading and error printing) library
Documentation
use rsjsonnet_lang::program::EvalStackTraceItem;
use rsjsonnet_lang::span::SpanManager;

use super::TextPartKind;
use super::message::{LabelKind, Message, MessageKind, MessageLabel};
use crate::src_manager::SrcManager;

#[must_use]
pub(crate) fn render(
    trace: &[EvalStackTraceItem],
    span_mgr: &SpanManager,
    src_mgr: &SrcManager,
) -> Vec<(String, TextPartKind)> {
    let mut out = Vec::new();

    for trace_item in trace.iter().rev() {
        match *trace_item {
            EvalStackTraceItem::Expr { span } => {
                Message {
                    kind: MessageKind::Note,
                    message: "while evaluating this expression".into(),
                    labels: vec![MessageLabel {
                        span,
                        kind: LabelKind::Note,
                        text: String::new(),
                    }],
                }
                .render(span_mgr, src_mgr, &mut out);
            }
            EvalStackTraceItem::Call { span, ref name } => {
                Message {
                    kind: MessageKind::Note,
                    message: if let Some(name) = name {
                        format!("while evaluating call to `{name}`")
                    } else {
                        "while evaluating call to function".into()
                    },
                    labels: span
                        .map(|span| MessageLabel {
                            span,
                            kind: LabelKind::Note,
                            text: String::new(),
                        })
                        .into_iter()
                        .collect(),
                }
                .render(span_mgr, src_mgr, &mut out);
            }
            EvalStackTraceItem::Variable { span, ref name } => {
                Message {
                    kind: MessageKind::Note,
                    message: format!("while evaluating variable `{name}`"),
                    labels: vec![MessageLabel {
                        span,
                        kind: LabelKind::Note,
                        text: String::new(),
                    }],
                }
                .render(span_mgr, src_mgr, &mut out);
            }
            EvalStackTraceItem::ArrayItem { span, index } => {
                Message {
                    kind: MessageKind::Note,
                    message: format!("while evaluating array item {index}"),
                    labels: span
                        .map(|span| MessageLabel {
                            span,
                            kind: LabelKind::Note,
                            text: String::new(),
                        })
                        .into_iter()
                        .collect(),
                }
                .render(span_mgr, src_mgr, &mut out);
            }
            EvalStackTraceItem::ObjectField { span, ref name } => {
                Message {
                    kind: MessageKind::Note,
                    message: format!("while evaluating object field {name:?}"),
                    labels: span
                        .map(|span| MessageLabel {
                            span,
                            kind: LabelKind::Note,
                            text: String::new(),
                        })
                        .into_iter()
                        .collect(),
                }
                .render(span_mgr, src_mgr, &mut out);
            }
            EvalStackTraceItem::CompareArrayItem { index } => {
                Message {
                    kind: MessageKind::Note,
                    message: format!("while comparing array item {index}"),
                    labels: vec![],
                }
                .render(span_mgr, src_mgr, &mut out);
            }
            EvalStackTraceItem::CompareObjectField { ref name } => {
                Message {
                    kind: MessageKind::Note,
                    message: format!("while comparing object field {name:?}"),
                    labels: vec![],
                }
                .render(span_mgr, src_mgr, &mut out);
            }
            EvalStackTraceItem::ManifestArrayItem { index } => {
                Message {
                    kind: MessageKind::Note,
                    message: format!("while manifesting array item {index}"),
                    labels: vec![],
                }
                .render(span_mgr, src_mgr, &mut out);
            }
            EvalStackTraceItem::ManifestObjectField { ref name } => {
                Message {
                    kind: MessageKind::Note,
                    message: format!("while manifesting object field {name:?}"),
                    labels: vec![],
                }
                .render(span_mgr, src_mgr, &mut out);
            }
            EvalStackTraceItem::Import { span } => {
                Message {
                    kind: MessageKind::Note,
                    message: "while evaluating import".into(),
                    labels: vec![MessageLabel {
                        span,
                        kind: LabelKind::Note,
                        text: String::new(),
                    }],
                }
                .render(span_mgr, src_mgr, &mut out);
            }
        }
    }

    out
}