trait-bound-pretty 0.1.0

Pretty-print Rust trait bound errors and type names.
Documentation
use super::{Bound, E0277, Item};

grammar;

Ident: &'input str = r"\w+";

Name: Vec<&'input str> = {
    <i:Ident> => vec![i],
    <qualifier:Ident> "::" <mut name:Name> => {
        name.push(qualifier);
        name
    },
};

Bound: Bound<'input> = {
    r"'\w+" => Bound::Lifetime(<>),
    Item => Bound::Item(<>),
    "&" <lifetime:r"'\w+"> "mut" <item:Item> => Bound::Reference{
        lifetime,
        mut_: true,
        item,
    },
    "&" <lifetime:r"'\w+"> <item:Item> => Bound::Reference{
        lifetime,
        mut_: false,
        item,
    },
    "(" <CommaSep<Bound>> ")" => Bound::Tuple(<>),
}

pub Item: Item<'input> = {
    <name:Name> => Item {
        name,
        generic_bounds: Vec::new(),
    },
    <name:Name> "<" <generic_bounds:CommaSep<Bound>> ">" => Item { <> },
};

// error[E0277]: the trait bound `Arc<sc_service::client::Client<sc_client_db::Backend<sp_runtime::generic::Block<sp_runtime::generic::Header<u32, BlakeTwo256>, OpaqueExtrinsic>>, LocalCallExecutor<sc_client_db::Backend<sp_runtime::generic::Block<sp_runtime::generic::Header<u32, BlakeTwo256>, OpaqueExtrinsic>>, NativeExecutor<Executor>>, sp_runtime::generic::Block<sp_runtime::generic::Header<u32, BlakeTwo256>, OpaqueExtrinsic>, RuntimeApi>>: HeaderBackend<sp_runtime::generic::Block<sp_runtime::generic::Header<u32, BlakeTwo256>, OpaqueExtrinsic>>` is not satisfied
pub E0277: E0277<'input> = {
    "error[E0277]: the trait bound `" <item:Item> ":" <trait_bound:Item> "` is not satisfied" => E0277 { <> }
};

// CommaSep requires internal commas only, no trailing
CommaSep<T>: Vec<T> = {
    T => vec![<>],
    <mut head:CommaSep<T>> "," <tail:T> => {
        head.push(tail);
        head
    }
}