pub struct Template<'env, 'source>where
'env: 'source,{ /* private fields */ }
Expand description
Represents a handle to a template.
Templates are stored in the Environment
as bytecode instructions. With the
Environment::get_template
method that is looked up and returned in form of
this handle. Such a template can be cheaply copied as it only holds references.
To render the render
method can be used.
Implementations§
Source§impl<'env, 'source> Template<'env, 'source>
impl<'env, 'source> Template<'env, 'source>
Sourcepub fn render<S>(&self, ctx: S) -> Result<String, Error>where
S: Serialize,
pub fn render<S>(&self, ctx: S) -> Result<String, Error>where
S: Serialize,
Renders the template into a string.
The provided value is used as the initial context for the template. It
can be any object that implements Serialize
. You
can either create your own struct and derive Serialize
for it or the
context!
macro can be used to create an ad-hoc context.
For very large contexts and to avoid the overhead of serialization of
potentially unused values, you might consider using a dynamic
Object
as value. For more
information see Map as Context.
let tmpl = env.get_template("hello").unwrap();
println!("{}", tmpl.render(context!(name => "John")).unwrap());
To render a single block use eval_to_state
in
combination with State::render_block
.
Note on values: The Value
type implements Serialize
and can be
efficiently passed to render. It does not undergo actual serialization.
Sourcepub fn render_and_return_state<S>(
&self,
ctx: S,
) -> Result<(String, State<'_, 'env>), Error>where
S: Serialize,
pub fn render_and_return_state<S>(
&self,
ctx: S,
) -> Result<(String, State<'_, 'env>), Error>where
S: Serialize,
Like render
but also return the evaluated State
.
This can be used to inspect the State
of the template post evaluation
for instance to get fuel consumption numbers or to access globally set
variables.
let tmpl = env.template_from_str("{% set x = 42 %}Hello {{ what }}!").unwrap();
let (rv, state) = tmpl.render_and_return_state(context!{ what => "World" }).unwrap();
assert_eq!(rv, "Hello World!");
assert_eq!(state.lookup("x"), Some(Value::from(42)));
Note on values: The Value
type implements Serialize
and can be
efficiently passed to render. It does not undergo actual serialization.
Sourcepub fn render_to_write<S, W>(
&self,
ctx: S,
w: W,
) -> Result<State<'_, 'env>, Error>
pub fn render_to_write<S, W>( &self, ctx: S, w: W, ) -> Result<State<'_, 'env>, Error>
Renders the template into an io::Write
.
This works exactly like render
but instead writes the template
as it’s evaluating into an io::Write
. It also returns the State
like
render_and_return_state
does.
use std::io::stdout;
let tmpl = env.get_template("hello").unwrap();
tmpl.render_to_write(context!(name => "John"), &mut stdout()).unwrap();
Note on values: The Value
type implements Serialize
and can be
efficiently passed to render. It does not undergo actual serialization.
Sourcepub fn eval_to_state<S>(&self, ctx: S) -> Result<State<'_, 'env>, Error>where
S: Serialize,
pub fn eval_to_state<S>(&self, ctx: S) -> Result<State<'_, 'env>, Error>where
S: Serialize,
Evaluates the template into a State
.
This evaluates the template, discards the output and returns the final
State
for introspection. From there global variables or blocks
can be accessed. What this does is quite similar to how the engine
internally works with templates that are extended or imported from.
let tmpl = env.get_template("hello")?;
let state = tmpl.eval_to_state(context!(name => "John"))?;
println!("{:?}", state.exports());
If you also want to render, use render_and_return_state
.
For more information see State
.
Sourcepub fn undeclared_variables(&self, nested: bool) -> HashSet<String>
pub fn undeclared_variables(&self, nested: bool) -> HashSet<String>
Returns a set of all undeclared variables in the template.
This returns a set of all variables that might be looked up
at runtime by the template. Since this is runs a static
analysis, the actual control flow is not considered. This
also cannot take into account what happens due to includes,
imports or extending. If nested
is set to true
, then also
nested trivial attribute lookups are considered and returned.
let mut env = Environment::new();
env.add_template("x", "{% set x = foo %}{{ x }}{{ bar.baz }}").unwrap();
let tmpl = env.get_template("x").unwrap();
let undeclared = tmpl.undeclared_variables(false);
// returns ["foo", "bar"]
let undeclared = tmpl.undeclared_variables(true);
// returns ["foo", "bar.baz"]
Trait Implementations§
Auto Trait Implementations§
impl<'env, 'source> Freeze for Template<'env, 'source>
impl<'env, 'source> !RefUnwindSafe for Template<'env, 'source>
impl<'env, 'source> Send for Template<'env, 'source>
impl<'env, 'source> Sync for Template<'env, 'source>
impl<'env, 'source> Unpin for Template<'env, 'source>
impl<'env, 'source> !UnwindSafe for Template<'env, 'source>
Blanket Implementations§
Source§impl<T> AsAny for Twhere
T: Any,
impl<T> AsAny for Twhere
T: Any,
fn as_any_ref(&self) -> &(dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
Source§impl<'a, T, E> AsTaggedExplicit<'a, E> for Twhere
T: 'a,
impl<'a, T, E> AsTaggedExplicit<'a, E> for Twhere
T: 'a,
Source§impl<'a, T, E> AsTaggedImplicit<'a, E> for Twhere
T: 'a,
impl<'a, T, E> AsTaggedImplicit<'a, E> for Twhere
T: 'a,
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self
into a Left
variant of Either<Self, Self>
if into_left
is true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self
into a Left
variant of Either<Self, Self>
if into_left(&self)
returns true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moreSource§impl<T> Paint for Twhere
T: ?Sized,
impl<T> Paint for Twhere
T: ?Sized,
Source§fn fg(&self, value: Color) -> Painted<&T>
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 bright_black(&self) -> Painted<&T>
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>
fn bright_red(&self) -> Painted<&T>
Source§fn bright_green(&self) -> Painted<&T>
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>
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>
fn bright_blue(&self) -> Painted<&T>
Source§fn bright_magenta(&self) -> Painted<&T>
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>
fn bright_cyan(&self) -> Painted<&T>
Source§fn bright_white(&self) -> Painted<&T>
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>
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>
fn on_primary(&self) -> Painted<&T>
Source§fn on_magenta(&self) -> Painted<&T>
fn on_magenta(&self) -> Painted<&T>
Source§fn on_bright_black(&self) -> Painted<&T>
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>
fn on_bright_red(&self) -> Painted<&T>
Source§fn on_bright_green(&self) -> Painted<&T>
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>
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>
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>
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>
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>
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>
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 underline(&self) -> Painted<&T>
fn underline(&self) -> Painted<&T>
Returns self
with the
attr()
set to
Attribute::Underline
.
§Example
println!("{}", value.underline());
Source§fn rapid_blink(&self) -> Painted<&T>
fn rapid_blink(&self) -> Painted<&T>
Returns self
with the
attr()
set to
Attribute::RapidBlink
.
§Example
println!("{}", value.rapid_blink());
Source§fn quirk(&self, value: Quirk) -> Painted<&T>
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 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.
fn clear(&self) -> Painted<&T>
resetting()
due to conflicts with Vec::clear()
.
The clear()
method will be removed in a future release.Source§fn whenever(&self, value: Condition) -> Painted<&T>
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);