Skip to content

rust-sailfish/sailfish

Folders and files

NameName
Last commit message
Last commit date
Jun 11, 2024
Nov 29, 2022
Jan 1, 2021
Aug 26, 2024
Aug 26, 2024
Oct 4, 2024
Aug 26, 2024
Aug 26, 2024
Aug 26, 2024
Aug 26, 2024
Jun 8, 2024
Feb 12, 2025
Jun 9, 2020
Jun 5, 2020
Jun 21, 2023
Aug 26, 2024
Aug 26, 2024
Jun 5, 2020
Aug 26, 2024
Dec 23, 2020
Dec 29, 2020
Jun 9, 2020
Nov 29, 2022
Jun 9, 2020
Jun 5, 2020

Repository files navigation

SailFish

Simple, small, and extremely fast template engine for Rust

TestsVersiondependency statusRust 1.60License: MIT

User Guide | API Docs | Examples

✨ Features

  • Simple and intuitive syntax inspired by EJS
  • Include another template file inside template
  • Built-in filters
  • Minimal dependencies (<15 crates in total)
  • Extremely fast (See benchmarks)
  • Better error message
  • Syntax highlighting support (vscode, vim)
  • Works on Rust 1.60 or later

🐟 Example

Dependencies:

[dependencies]
sailfish = "0.9.0"

You can choose to use TemplateSimple to access fields directly:

Template file (templates/hello.stpl):

<html>
  <body>
    <% for msg in messages { %>
      <div><%= msg %></div>
    <% } %>
  </body>
</html>

Code:

use sailfish::TemplateSimple;

#[derive(TemplateSimple)]
#[template(path = "hello.stpl")]
struct HelloTemplate {
    messages: Vec<String>
}

fn main() {
    let ctx = HelloTemplate {
        messages: vec![String::from("foo"), String::from("bar")],
    };
    println!("{}", ctx.render_once().unwrap());
}

Or use the more powerful Template/TemplateMut/TemplateOnce:

Template file (templates/hello.stpl):

<html>
  <body>
    <% for msg in &self.messages { %>
      <div><%= msg %></div>
    <% } %>
    <div><%= self.say_hello() %></div>
  </body>
</html>

Code:

use sailfish::Template;

#[derive(Template)]
#[template(path = "hello.stpl")]
struct HelloTemplate {
    messages: Vec<String>
}

impl HelloTemplate {
    fn say_hello(&self) -> String {
        String::from("Hello!")
    }
}

fn main() {
    let ctx = HelloTemplate {
        messages: vec![String::from("foo"), String::from("bar")],
    };
    println!("{}", ctx.render().unwrap());
}

You can find more examples in examples directory.

🐾 Roadmap

  • Template trait (RFC)
  • Template inheritance (block, partials, etc.)

πŸ‘€ Author

πŸ‡―πŸ‡΅ Ryohei Machida

🀝 Contributing

Contributions, issues and feature requests are welcome!

Since sailfish is an immature library, there are many planned features that is on a stage of RFC. Please leave a comment if you have an idea about its design!

Also I welcome any pull requests to improve sailfish! Find issues with Status: PR Welcome label, and let's create a new pull request!

Show your support

Give a ⭐️ if this project helped you!

πŸ“ License

Copyright Β© 2020 Ryohei Machida.

This project is MIT licensed.


This README was generated with ❀️ by readme-md-generator