Skip to main content

DiagnosticMessageBuilder

Struct DiagnosticMessageBuilder 

Source
pub struct DiagnosticMessageBuilder { /* private fields */ }
Expand description

Builder for creating diagnostic messages following tidyverse guidelines.

The builder API naturally encourages the tidyverse four-part error structure:

  1. Title: Brief error message (via .error(), .warning(), etc.)
  2. Problem: What went wrong - the “must” or “can’t” statement (via .problem())
  3. Details: Specific information - max 5 bulleted items (via .add_detail(), .add_info())
  4. Hints: Optional guidance (via .add_hint())

§Example

use quarto_error_reporting::DiagnosticMessageBuilder;

let error = DiagnosticMessageBuilder::error("Incompatible types")
    .with_code("Q-1-2") // quarto-error-code-audit-ignore
    .problem("Cannot combine date and datetime types")
    .add_detail("`x`{.arg} has type `date`{.type}")
    .add_detail("`y`{.arg} has type `datetime`{.type}")
    .add_hint("Convert both to the same type?")
    .build();

assert_eq!(error.title, "Incompatible types");
assert_eq!(error.code, Some("Q-1-2".to_string())); // quarto-error-code-audit-ignore
assert!(error.problem.is_some());
assert_eq!(error.details.len(), 2);
assert_eq!(error.hints.len(), 1);

Implementations§

Source§

impl DiagnosticMessageBuilder

Source

pub fn new(kind: DiagnosticKind, title: impl Into<String>) -> Self

Create a new builder with the specified kind and title.

Most code should use the convenience methods .error(), .warning(), or .info() instead of calling this directly.

Source

pub fn error(title: impl Into<String>) -> Self

Create an error diagnostic builder.

§Example
use quarto_error_reporting::DiagnosticMessageBuilder;

let error = DiagnosticMessageBuilder::error("YAML Syntax Error")
    .build();
Source

pub fn generic_error( message: impl Into<String>, file: &str, line: u32, ) -> DiagnosticMessage

Create a generic error for migration purposes.

This is a convenience method for the migration from ErrorCollector to DiagnosticMessage. It creates an error with code Q-0-99 (quarto-error-code-audit-ignore) and includes file/line information for tracking where the error originated in the code.

§Example
use quarto_error_reporting::DiagnosticMessageBuilder;

let error = DiagnosticMessageBuilder::generic_error(
    "Found unexpected attribute",
    file!(),
    line!()
);
assert_eq!(error.code, Some("Q-0-99".to_string())); // quarto-error-code-audit-ignore
assert!(error.title.contains("Found unexpected attribute"));
Source

pub fn generic_warning( message: impl Into<String>, file: &str, line: u32, ) -> DiagnosticMessage

Create a generic warning for migration purposes.

Similar to generic_error() but for warnings.

§Example
use quarto_error_reporting::DiagnosticMessageBuilder;

let warning = DiagnosticMessageBuilder::generic_warning(
    "Caption found without table",
    file!(),
    line!()
);
assert_eq!(warning.code, Some("Q-0-99".to_string()));
Source

pub fn warning(title: impl Into<String>) -> Self

Create a warning diagnostic builder.

§Example
use quarto_error_reporting::DiagnosticMessageBuilder;

let warning = DiagnosticMessageBuilder::warning("Deprecated feature")
    .build();
Source

pub fn info(title: impl Into<String>) -> Self

Create an info diagnostic builder.

§Example
use quarto_error_reporting::DiagnosticMessageBuilder;

let info = DiagnosticMessageBuilder::info("Processing complete")
    .build();
Source

pub fn with_code(self, code: impl Into<String>) -> Self

Set the error code.

Error codes follow the format Q-<subsystem>-<number> (e.g., “Q-1-1”). (quarto-error-code-audit-ignore)

§Example
use quarto_error_reporting::DiagnosticMessageBuilder;

let error = DiagnosticMessageBuilder::error("YAML Syntax Error")
    .with_code("Q-1-1") // quarto-error-code-audit-ignore
    .build();

assert_eq!(error.code, Some("Q-1-1".to_string())); // quarto-error-code-audit-ignore
Source

pub fn with_location(self, location: SourceInfo) -> Self

Attach a source location to this diagnostic.

The location identifies where in the source code the issue occurred. The location may track transformation history, allowing the error to be mapped back through multiple processing steps to the original source file.

§Example
ⓘ
use quarto_error_reporting::DiagnosticMessageBuilder;
use quarto_source_map::{SourceInfo, SourceContext, FileId, Range, Location};

let mut ctx = SourceContext::new();
let file_id = ctx.add_file("test.qmd".into(), Some("content".into()));
let range = Range {
    start: Location { offset: 0, row: 0, column: 0 },
    end: Location { offset: 7, row: 0, column: 7 },
};
let source_info = SourceInfo::original(file_id, range);

let error = DiagnosticMessageBuilder::error("Parse error")
    .with_location(source_info)
    .build();
Source

pub fn problem(self, stmt: impl Into<MessageContent>) -> Self

Set the problem statement.

Following tidyverse guidelines, the problem statement should:

  • Start with a general, concise statement
  • Use “must” for requirements or “can’t” for impossibilities
  • Be specific about types/expectations
§Example
use quarto_error_reporting::DiagnosticMessageBuilder;

let error = DiagnosticMessageBuilder::error("Invalid input")
    .problem("`n` must be a numeric vector, not a character vector")
    .build();
Source

pub fn add_detail(self, detail: impl Into<MessageContent>) -> Self

Add an error detail (displayed with error/cross bullet).

Error details provide specific information about what went wrong. Following tidyverse guidelines:

  • Keep sentences short and specific
  • Reveal location, name, or content of problematic input
  • Limit to 5 total details (error + info) to avoid overwhelming users
§Example
use quarto_error_reporting::DiagnosticMessageBuilder;

let error = DiagnosticMessageBuilder::error("Incompatible lengths")
    .add_detail("`x` has length 3")
    .add_detail("`y` has length 5")
    .build();

assert_eq!(error.details.len(), 2);
Source

pub fn add_detail_at( self, detail: impl Into<MessageContent>, location: SourceInfo, ) -> Self

Add an error detail with a source location.

This allows adding contextual information that points to specific locations in the source code, creating rich multi-location error messages.

§Example
ⓘ
use quarto_error_reporting::DiagnosticMessageBuilder;

let error = DiagnosticMessageBuilder::error("Mismatched brackets")
    .add_detail_at("Opening bracket here", opening_location)
    .add_detail_at("But no closing bracket found", end_location)
    .build();
Source

pub fn add_info(self, info: impl Into<MessageContent>) -> Self

Add an info detail (displayed with info bullet).

Info details provide additional context or explanatory information.

§Example
use quarto_error_reporting::DiagnosticMessageBuilder;

let error = DiagnosticMessageBuilder::error("Missing file")
    .add_detail("Could not find `config.yaml`")
    .add_info("Default configuration will be used")
    .build();
Source

pub fn add_info_at( self, info: impl Into<MessageContent>, location: SourceInfo, ) -> Self

Add an info detail with a source location.

Source

pub fn add_note(self, note: impl Into<MessageContent>) -> Self

Add a note detail (displayed with plain bullet).

§Example
use quarto_error_reporting::DiagnosticMessageBuilder;

let error = DiagnosticMessageBuilder::error("Parse error")
    .add_note("This is an experimental feature")
    .build();
Source

pub fn add_note_at( self, note: impl Into<MessageContent>, location: SourceInfo, ) -> Self

Add a note detail with a source location.

Source

pub fn add_faded_at( self, content: impl Into<MessageContent>, location: SourceInfo, ) -> Self

Add a faded detail with a source location.

Rendered with the same dim grey colour Ariadne uses for unlabelled source characters, so it visually “punches a hole” in any wider label that also covers the same column range. Useful for excluding block-quote prefixes or other prefix decorations from the highlight of a multi-line span.

Source

pub fn add_hint(self, hint: impl Into<MessageContent>) -> Self

Add a hint for fixing the error.

Following tidyverse guidelines, hints should:

  • Only be included when the problem source is clear and common
  • Provide straightforward fix suggestions
  • End with a question mark if suggesting action
§Example
use quarto_error_reporting::DiagnosticMessageBuilder;

let error = DiagnosticMessageBuilder::error("Function not found")
    .problem("Could not find function `summarise()`")
    .add_hint("Did you mean `summarize()`?")
    .build();

assert_eq!(error.hints.len(), 1);
Source

pub fn build(self) -> DiagnosticMessage

Build the diagnostic message.

This consumes the builder and returns the constructed DiagnosticMessage.

§Example
use quarto_error_reporting::DiagnosticMessageBuilder;

let error = DiagnosticMessageBuilder::error("Parse error")
    .problem("Invalid syntax")
    .build();

assert_eq!(error.title, "Parse error");
Source

pub fn build_with_validation(self) -> (DiagnosticMessage, Vec<String>)

Build with validation.

This validates the message structure according to tidyverse guidelines:

  • Warns if there’s no problem statement (recommended but not required)
  • Warns if there are more than 5 details (overwhelming for users)
  • Future: Could check that hints end with ‘?’

Returns warnings as a Vec of strings. An empty Vec means validation passed.

§Example
use quarto_error_reporting::DiagnosticMessageBuilder;

let (error, warnings) = DiagnosticMessageBuilder::error("Test error")
    .build_with_validation();

// Warns because there's no problem statement
assert!(!warnings.is_empty());

Trait Implementations§

Source§

impl Clone for DiagnosticMessageBuilder

Source§

fn clone(&self) -> Self

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for DiagnosticMessageBuilder

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> Paint for T
where T: ?Sized,

Source§

fn fg(&self, value: Color) -> Painted<&T>

Returns a styled value derived from self with the foreground set to value.

This method should be used rarely. Instead, prefer to use color-specific builder methods like red() and green(), which have the same functionality but are pithier.

§Example

Set foreground color to white using fg():

use yansi::{Paint, Color};

painted.fg(Color::White);

Set foreground color to white using white().

use yansi::Paint;

painted.white();
Source§

fn primary(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: Primary].

§Example
println!("{}", value.primary());
Source§

fn fixed(&self, color: u8) -> Painted<&T>

Returns self with the fg() set to [Color :: Fixed].

§Example
println!("{}", value.fixed(color));
Source§

fn rgb(&self, r: u8, g: u8, b: u8) -> Painted<&T>

Returns self with the fg() set to [Color :: Rgb].

§Example
println!("{}", value.rgb(r, g, b));
Source§

fn black(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: Black].

§Example
println!("{}", value.black());
Source§

fn red(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: Red].

§Example
println!("{}", value.red());
Source§

fn green(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: Green].

§Example
println!("{}", value.green());
Source§

fn yellow(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: Yellow].

§Example
println!("{}", value.yellow());
Source§

fn blue(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: Blue].

§Example
println!("{}", value.blue());
Source§

fn magenta(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: Magenta].

§Example
println!("{}", value.magenta());
Source§

fn cyan(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: Cyan].

§Example
println!("{}", value.cyan());
Source§

fn white(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: White].

§Example
println!("{}", value.white());
Source§

fn bright_black(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: BrightBlack].

§Example
println!("{}", value.bright_black());
Source§

fn bright_red(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: BrightRed].

§Example
println!("{}", value.bright_red());
Source§

fn bright_green(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: BrightGreen].

§Example
println!("{}", value.bright_green());
Source§

fn bright_yellow(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: BrightYellow].

§Example
println!("{}", value.bright_yellow());
Source§

fn bright_blue(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: BrightBlue].

§Example
println!("{}", value.bright_blue());
Source§

fn bright_magenta(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: BrightMagenta].

§Example
println!("{}", value.bright_magenta());
Source§

fn bright_cyan(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: BrightCyan].

§Example
println!("{}", value.bright_cyan());
Source§

fn bright_white(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: BrightWhite].

§Example
println!("{}", value.bright_white());
Source§

fn bg(&self, value: Color) -> Painted<&T>

Returns a styled value derived from self with the background set to value.

This method should be used rarely. Instead, prefer to use color-specific builder methods like on_red() and on_green(), which have the same functionality but are pithier.

§Example

Set background color to red using fg():

use yansi::{Paint, Color};

painted.bg(Color::Red);

Set background color to red using on_red().

use yansi::Paint;

painted.on_red();
Source§

fn on_primary(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: Primary].

§Example
println!("{}", value.on_primary());
Source§

fn on_fixed(&self, color: u8) -> Painted<&T>

Returns self with the bg() set to [Color :: Fixed].

§Example
println!("{}", value.on_fixed(color));
Source§

fn on_rgb(&self, r: u8, g: u8, b: u8) -> Painted<&T>

Returns self with the bg() set to [Color :: Rgb].

§Example
println!("{}", value.on_rgb(r, g, b));
Source§

fn on_black(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: Black].

§Example
println!("{}", value.on_black());
Source§

fn on_red(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: Red].

§Example
println!("{}", value.on_red());
Source§

fn on_green(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: Green].

§Example
println!("{}", value.on_green());
Source§

fn on_yellow(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: Yellow].

§Example
println!("{}", value.on_yellow());
Source§

fn on_blue(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: Blue].

§Example
println!("{}", value.on_blue());
Source§

fn on_magenta(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: Magenta].

§Example
println!("{}", value.on_magenta());
Source§

fn on_cyan(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: Cyan].

§Example
println!("{}", value.on_cyan());
Source§

fn on_white(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: White].

§Example
println!("{}", value.on_white());
Source§

fn on_bright_black(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: BrightBlack].

§Example
println!("{}", value.on_bright_black());
Source§

fn on_bright_red(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: BrightRed].

§Example
println!("{}", value.on_bright_red());
Source§

fn on_bright_green(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: BrightGreen].

§Example
println!("{}", value.on_bright_green());
Source§

fn on_bright_yellow(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: BrightYellow].

§Example
println!("{}", value.on_bright_yellow());
Source§

fn on_bright_blue(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: BrightBlue].

§Example
println!("{}", value.on_bright_blue());
Source§

fn on_bright_magenta(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: BrightMagenta].

§Example
println!("{}", value.on_bright_magenta());
Source§

fn on_bright_cyan(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: BrightCyan].

§Example
println!("{}", value.on_bright_cyan());
Source§

fn on_bright_white(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: BrightWhite].

§Example
println!("{}", value.on_bright_white());
Source§

fn attr(&self, value: Attribute) -> Painted<&T>

Enables the styling Attribute value.

This method should be used rarely. Instead, prefer to use attribute-specific builder methods like bold() and underline(), which have the same functionality but are pithier.

§Example

Make text bold using attr():

use yansi::{Paint, Attribute};

painted.attr(Attribute::Bold);

Make text bold using using bold().

use yansi::Paint;

painted.bold();
Source§

fn bold(&self) -> Painted<&T>

Returns self with the attr() set to [Attribute :: Bold].

§Example
println!("{}", value.bold());
Source§

fn dim(&self) -> Painted<&T>

Returns self with the attr() set to [Attribute :: Dim].

§Example
println!("{}", value.dim());
Source§

fn italic(&self) -> Painted<&T>

Returns self with the attr() set to [Attribute :: Italic].

§Example
println!("{}", value.italic());
Source§

fn underline(&self) -> Painted<&T>

Returns self with the attr() set to [Attribute :: Underline].

§Example
println!("{}", value.underline());

Returns self with the attr() set to [Attribute :: Blink].

§Example
println!("{}", value.blink());

Returns self with the attr() set to [Attribute :: RapidBlink].

§Example
println!("{}", value.rapid_blink());
Source§

fn invert(&self) -> Painted<&T>

Returns self with the attr() set to [Attribute :: Invert].

§Example
println!("{}", value.invert());
Source§

fn conceal(&self) -> Painted<&T>

Returns self with the attr() set to [Attribute :: Conceal].

§Example
println!("{}", value.conceal());
Source§

fn strike(&self) -> Painted<&T>

Returns self with the attr() set to [Attribute :: Strike].

§Example
println!("{}", value.strike());
Source§

fn quirk(&self, value: Quirk) -> Painted<&T>

Enables the yansi Quirk value.

This method should be used rarely. Instead, prefer to use quirk-specific builder methods like mask() and wrap(), which have the same functionality but are pithier.

§Example

Enable wrapping using .quirk():

use yansi::{Paint, Quirk};

painted.quirk(Quirk::Wrap);

Enable wrapping using wrap().

use yansi::Paint;

painted.wrap();
Source§

fn mask(&self) -> Painted<&T>

Returns self with the quirk() set to [Quirk :: Mask].

§Example
println!("{}", value.mask());
Source§

fn wrap(&self) -> Painted<&T>

Returns self with the quirk() set to [Quirk :: Wrap].

§Example
println!("{}", value.wrap());
Source§

fn linger(&self) -> Painted<&T>

Returns self with the quirk() set to [Quirk :: Linger].

§Example
println!("{}", value.linger());
Source§

fn clear(&self) -> Painted<&T>

👎Deprecated since 1.0.1:

renamed to resetting() due to conflicts with Vec::clear(). The clear() method will be removed in a future release.

Returns self with the quirk() set to [Quirk :: Clear].

§Example
println!("{}", value.clear());
Source§

fn resetting(&self) -> Painted<&T>

Returns self with the quirk() set to [Quirk :: Resetting].

§Example
println!("{}", value.resetting());
Source§

fn bright(&self) -> Painted<&T>

Returns self with the quirk() set to [Quirk :: Bright].

§Example
println!("{}", value.bright());
Source§

fn on_bright(&self) -> Painted<&T>

Returns self with the quirk() set to [Quirk :: OnBright].

§Example
println!("{}", value.on_bright());
Source§

fn whenever(&self, value: Condition) -> Painted<&T>

Conditionally enable styling based on whether the Condition value applies. Replaces any previous condition.

See the crate level docs for more details.

§Example

Enable styling painted only when both stdout and stderr are TTYs:

use yansi::{Paint, Condition};

painted.red().on_yellow().whenever(Condition::STDOUTERR_ARE_TTY);
Source§

fn new(self) -> Painted<Self>
where Self: Sized,

Create a new Painted with a default Style. Read more
Source§

fn paint<S>(&self, style: S) -> Painted<&Self>
where S: Into<Style>,

Apply a style wholesale to self. Any previous style is replaced. Read more
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = !

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, !>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.