Type-safe HTML templating in Zig

(lalinsky.com)

50 points | by lukaslalinsky 1 hour ago

4 comments

  • fergie 58 minutes ago
    W3C: Why can't we just have <includes src="./header.html"> and be done with it?
  • Humphrey 1 hour ago
    I love the idea! I could imagine something similar created for other languages too. Perhaps written in a way that a template could be reused in, let's say Django, and a JS React frontend. With all the type-safety that tsx provides.
  • slopinthebag 1 hour ago
    one thing i love about rust's macros is that you can accomplish this without needing a separate file type or inventing syntax

       #[component]
       pub fn HomePage(user: Option<User>) -> Element {
          rsx! {
             Layout { 
                title: "Home",
                if let Some(u) = user {
                   h1 { "Welcome back, {u.name}!" }
                   a { href: "/users/{u.id}", "Your profile" }
                } else {
                   h1 { "Welcome, guest!" }
                   a { href: "/login", "Log in" }
                }
             }
          }
       }
    • dnautics 55 minutes ago
      > you can accomplish this

      That's not HTML though, you have to learn a whole new dsl that must conform to rust parser rules. So, not the same thing at all.

      • josephg 45 minutes ago
        You can do actual html. This is Leptos, a Solidjs like rust library:

            #[component]
            fn App() -> impl IntoView {
                let (count, set_count) = signal(0);
                view! {
                    <button
                        on:click=move |_| set_count.set(3) >
                        "Click me”</button>
                    <p>{move || count.get() * 2}</p>
                }
            }
      • slopinthebag 4 minutes ago
        i prefer it, but you can also get html if you want

        eg

           html! {
               <div onclick=|_ev: web_sys::MouseEvent| {}>
                  You can type text right into the elements
                  { component }
                  { text_var }
               </div>
            };
    • skavi 22 minutes ago
      but you have invented syntax
    • asimovDev 1 hour ago
      This is just Twig templates, crazy. It's cool that Rust can do this out of a box
      • slopinthebag 1 hour ago
        yep and you get rust's lsp support too, autoformatting, etc.

        this is rsx, but there are other macros that look just like html. i prefer this though, it's much more compact and readable imo

        • lukaslalinsky 6 minutes ago
          I'm not a fan of Rust, the overly flexible macros are actually one reason for it, but if you can indeed get LSP support in a custom syntax like this, that's really awesome. Thank you for the example.
    • sroerick 1 hour ago
      That is super cool actually
    • eggsandbeer 1 hour ago
      [dead]
  • thetexaslawdog 1 hour ago
    [flagged]