summaryrefslogtreecommitdiff
path: root/src/library/pad.rs
blob: ba28bf8e1d3afbe67cdbcc36fecf03e113255a71 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
use super::*;

/// `pad`: Pad content at the sides.
///
/// # Positional arguments
/// - Padding for all sides: `padding`, of type `linear` relative to sides.
/// - Body: of type `template`.
///
/// # Named arguments
/// - Left padding:   `left`, of type `linear` relative to parent width.
/// - Right padding:  `right`, of type `linear` relative to parent width.
/// - Top padding:    `top`, of type `linear` relative to parent height.
/// - Bottom padding: `bottom`, of type `linear` relative to parent height.
pub fn pad(ctx: &mut EvalContext, args: &mut ValueArgs) -> Value {
    let all = args.find(ctx);
    let left = args.get(ctx, "left");
    let top = args.get(ctx, "top");
    let right = args.get(ctx, "right");
    let bottom = args.get(ctx, "bottom");
    let body = args.require::<ValueTemplate>(ctx, "body").unwrap_or_default();

    let padding = Sides::new(
        left.or(all).unwrap_or_default(),
        top.or(all).unwrap_or_default(),
        right.or(all).unwrap_or_default(),
        bottom.or(all).unwrap_or_default(),
    );

    Value::template("pad", move |ctx| {
        let snapshot = ctx.state.clone();

        let child = ctx.exec(&body).into();
        ctx.push(NodePad { padding, child });

        ctx.state = snapshot;
    })
}