summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorGabriel Majeri <gabriel.majeri6@gmail.com>2019-11-11 13:42:24 +0200
committerDylan DPC <dylan.dpc@gmail.com>2019-11-11 12:42:24 +0100
commita7b3aa0444c8b4020e68d009180068b1c1b4fd92 (patch)
tree58418e41fd09f97b273362cfd06bb8f0891424b7 /src
parenta9160acd644b5a89e7d69f5a9ffdd2c3a0e93c92 (diff)
Add support for Rust edition 2018 in playpens (#1086)
* Add support for Rust edition 2018 in playpens * Add Rust edition support to rustdoc * Run rustfmt * Fix enum variant reference
Diffstat (limited to 'src')
-rw-r--r--src/book/mod.rs18
-rw-r--r--src/config.rs60
-rw-r--r--src/renderer/html_handlebars/hbs_renderer.rs31
3 files changed, 94 insertions, 15 deletions
diff --git a/src/book/mod.rs b/src/book/mod.rs
index 8d69eea2..29d2dc3d 100644
--- a/src/book/mod.rs
+++ b/src/book/mod.rs
@@ -27,7 +27,7 @@ use crate::preprocess::{
use crate::renderer::{CmdRenderer, HtmlHandlebars, MarkdownRenderer, RenderContext, Renderer};
use crate::utils;
-use crate::config::Config;
+use crate::config::{Config, RustEdition};
/// The object used to manage and build a book.
pub struct MDBook {
@@ -262,11 +262,17 @@ impl MDBook {
let mut tmpf = utils::fs::create_file(&path)?;
tmpf.write_all(ch.content.as_bytes())?;
- let output = Command::new("rustdoc")
- .arg(&path)
- .arg("--test")
- .args(&library_args)
- .output()?;
+ let mut cmd = Command::new("rustdoc");
+
+ cmd.arg(&path).arg("--test").args(&library_args);
+
+ if let Some(html_cfg) = self.config.html_config() {
+ if html_cfg.playpen.edition == RustEdition::E2018 {
+ cmd.args(&["--edition", "2018"]);
+ }
+ }
+
+ let output = cmd.output()?;
if !output.status.success() {
bail!(ErrorKind::Subprocess(
diff --git a/src/config.rs b/src/config.rs
index fae3da84..4c8624a6 100644
--- a/src/config.rs
+++ b/src/config.rs
@@ -513,6 +513,8 @@ pub struct Playpen {
pub copy_js: bool,
/// Display line numbers on playpen snippets. Default: `false`.
pub line_numbers: bool,
+ /// Rust edition to use for the code. Default: `2015`.
+ pub edition: RustEdition,
}
impl Default for Playpen {
@@ -522,10 +524,66 @@ impl Default for Playpen {
copyable: true,
copy_js: true,
line_numbers: false,
+ edition: RustEdition::E2015,
}
}
}
+#[derive(Debug, Clone, PartialEq)]
+/// The edition of Rust used in a playpen code snippet
+pub enum RustEdition {
+ /// The 2018 edition of Rust
+ E2018,
+ /// The 2015 edition of Rust
+ E2015,
+}
+
+impl Default for RustEdition {
+ fn default() -> Self {
+ RustEdition::E2015
+ }
+}
+
+impl Serialize for RustEdition {
+ fn serialize<S>(&self, serializer: S) -> std::result::Result<S::Ok, S::Error>
+ where
+ S: Serializer,
+ {
+ match self {
+ RustEdition::E2015 => serializer.serialize_str("2015"),
+ RustEdition::E2018 => serializer.serialize_str("2018"),
+ }
+ }
+}
+
+impl<'de> Deserialize<'de> for RustEdition {
+ fn deserialize<D>(de: D) -> std::result::Result<Self, D::Error>
+ where
+ D: Deserializer<'de>,
+ {
+ use serde::de::Error;
+
+ let raw = Value::deserialize(de)?;
+
+ let edition = match raw {
+ Value::String(s) => s,
+ _ => {
+ return Err(D::Error::custom("Rust edition should be a string"));
+ }
+ };
+
+ let edition = match edition.as_str() {
+ "2018" => RustEdition::E2018,
+ "2015" => RustEdition::E2015,
+ _ => {
+ return Err(D::Error::custom("Unknown Rust edition"));
+ }
+ };
+
+ Ok(edition)
+ }
+}
+
/// Configuration of the search functionality of the HTML renderer.
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(default, rename_all = "kebab-case")]
@@ -630,6 +688,7 @@ mod tests {
[output.html.playpen]
editable = true
editor = "ace"
+ edition = "2018"
[preprocessor.first]
@@ -658,6 +717,7 @@ mod tests {
copyable: true,
copy_js: true,
line_numbers: false,
+ edition: RustEdition::E2018,
};
let html_should_be = HtmlConfig {
curly_quotes: true,
diff --git a/src/renderer/html_handlebars/hbs_renderer.rs b/src/renderer/html_handlebars/hbs_renderer.rs
index 0be92562..aa2bdcc9 100644
--- a/src/renderer/html_handlebars/hbs_renderer.rs
+++ b/src/renderer/html_handlebars/hbs_renderer.rs
@@ -1,5 +1,5 @@
use crate::book::{Book, BookItem};
-use crate::config::{Config, HtmlConfig, Playpen};
+use crate::config::{Config, HtmlConfig, Playpen, RustEdition};
use crate::errors::*;
use crate::renderer::html_handlebars::helpers;
use crate::renderer::{RenderContext, Renderer};
@@ -608,14 +608,27 @@ fn add_playpen_pre(html: &str, playpen_config: &Playpen) -> String {
let classes = &caps[2];
let code = &caps[3];
- if classes.contains("language-rust") {
- if (!classes.contains("ignore") && !classes.contains("noplaypen"))
- || classes.contains("mdbook-runnable")
- {
- // wrap the contents in an external pre block
- format!(
- "<pre class=\"playpen\"><code class=\"{}\">{}</code></pre>",
- classes,
+
+ if (classes.contains("language-rust")
+ && !classes.contains("ignore")
+ && !classes.contains("noplaypen"))
+ || classes.contains("mdbook-runnable")
+ {
+ let mut classes = classes.to_string();
+ match playpen_config.edition {
+ RustEdition::E2018 => classes += " edition2018",
+ _ => (),
+ }
+
+ // wrap the contents in an external pre block
+ format!(
+ "<pre class=\"playpen\"><code class=\"{}\">{}</code></pre>",
+ classes,
+ {
+ let content: Cow<'_, str> = if playpen_config.editable
+ && classes.contains("editable")
+ || text.contains("fn main")
+ || text.contains("quick_main!")
{
let content: Cow<'_, str> = if playpen_config.editable
&& classes.contains("editable")