From 3eb4254ffb05b7c0f39a57e65f0a9ed44822c943 Mon Sep 17 00:00:00 2001
From: Benjamin Halsted <bhalsted@gmail.com>
Date: Fri, 30 Jul 2021 05:05:31 -0700
Subject: [PATCH] Using no_std + alloc (#279)

Removed references to `std` and replaced them with references to `core` and `alloc`.
Features `rocket` and `iron` still require `std`.

Co-authored-by: Chris Wong <lambda.fairy@gmail.com>
---
 CHANGELOG.md           |  3 +++
 maud/src/lib.rs        | 18 ++++++++++++++++--
 maud_htmlescape/lib.rs |  7 ++++++-
 maud_macros/src/lib.rs |  3 ++-
 4 files changed, 27 insertions(+), 4 deletions(-)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index 9fbc70d..c810674 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,6 +2,9 @@
 
 ## [Unreleased]
 
+- Support `no_std` + `alloc`.
+  [#278](https://github.com/lambda-fairy/maud/issues/278)
+
 ## [0.22.2] - 2021-01-09
 
 - Don't require `?` suffix for empty attributes. The old syntax is kept for backward compatibility.
diff --git a/maud/src/lib.rs b/maud/src/lib.rs
index 035c1b4..a2f1499 100644
--- a/maud/src/lib.rs
+++ b/maud/src/lib.rs
@@ -1,3 +1,5 @@
+#![no_std]
+
 //! A macro for writing HTML templates.
 //!
 //! This documentation only describes the runtime API. For a general
@@ -7,7 +9,10 @@
 
 #![doc(html_root_url = "https://docs.rs/maud/0.22.2")]
 
-use std::fmt::{self, Write};
+extern crate alloc;
+
+use alloc::string::String;
+use core::fmt::{self, Write};
 
 pub use maud_macros::{html, html_debug};
 
@@ -89,8 +94,9 @@ impl<T: fmt::Display + ?Sized> Render for T {
 #[doc(hidden)]
 pub mod render {
     use crate::Render;
+    use alloc::string::String;
+    use core::fmt::Write;
     use maud_htmlescape::Escaper;
-    use std::fmt::Write;
 
     pub trait RenderInternal {
         fn __maud_render_to(&self, w: &mut String);
@@ -167,7 +173,11 @@ pub const DOCTYPE: PreEscaped<&'static str> = PreEscaped("<!DOCTYPE html>");
 
 #[cfg(feature = "iron")]
 mod iron_support {
+    extern crate std;
+
     use crate::PreEscaped;
+    use alloc::boxed::Box;
+    use alloc::string::String;
     use iron::headers::ContentType;
     use iron::modifier::{Modifier, Set};
     use iron::modifiers::Header;
@@ -191,7 +201,10 @@ mod iron_support {
 
 #[cfg(feature = "rocket")]
 mod rocket_support {
+    extern crate std;
+
     use crate::PreEscaped;
+    use alloc::string::String;
     use rocket::http::{ContentType, Status};
     use rocket::request::Request;
     use rocket::response::{Responder, Response};
@@ -211,6 +224,7 @@ mod rocket_support {
 mod actix_support {
     use crate::PreEscaped;
     use actix_web_dep::{Error, HttpRequest, HttpResponse, Responder};
+    use alloc::string::String;
     use futures_util::future::{ok, Ready};
 
     impl Responder for PreEscaped<String> {
diff --git a/maud_htmlescape/lib.rs b/maud_htmlescape/lib.rs
index c682c06..6f7a20c 100644
--- a/maud_htmlescape/lib.rs
+++ b/maud_htmlescape/lib.rs
@@ -1,3 +1,5 @@
+#![cfg_attr(not(test), no_std)]
+
 //! Internal support code used by the [Maud] template engine.
 //!
 //! You should not need to depend on this crate directly.
@@ -6,7 +8,10 @@
 
 #![doc(html_root_url = "https://docs.rs/maud_htmlescape/0.17.0")]
 
-use std::fmt;
+extern crate alloc;
+
+use alloc::string::String;
+use core::fmt;
 
 /// An adapter that escapes HTML special characters.
 ///
diff --git a/maud_macros/src/lib.rs b/maud_macros/src/lib.rs
index f48710b..9c4148d 100644
--- a/maud_macros/src/lib.rs
+++ b/maud_macros/src/lib.rs
@@ -35,8 +35,9 @@ fn expand(input: TokenStream) -> TokenStream {
     let markups = parse::parse(input);
     let stmts = generate::generate(markups, output_ident.clone());
     quote!({
+        extern crate alloc;
         extern crate maud;
-        let mut #output_ident = ::std::string::String::with_capacity(#size_hint);
+        let mut #output_ident = alloc::string::String::with_capacity(#size_hint);
         #stmts
         maud::PreEscaped(#output_ident)
     })