Make new [rust] config and move edition config under it
This commit is contained in:
parent
53d821bf6d
commit
255756cfee
|
@ -9,6 +9,8 @@ Here is an example of what a ***book.toml*** file might look like:
|
||||||
title = "Example book"
|
title = "Example book"
|
||||||
author = "John Doe"
|
author = "John Doe"
|
||||||
description = "The example book covers examples."
|
description = "The example book covers examples."
|
||||||
|
|
||||||
|
[rust]
|
||||||
edition = "2018"
|
edition = "2018"
|
||||||
|
|
||||||
[build]
|
[build]
|
||||||
|
@ -44,7 +46,6 @@ This is general information about your book.
|
||||||
`src` directly under the root folder. But this is configurable with the `src`
|
`src` directly under the root folder. But this is configurable with the `src`
|
||||||
key in the configuration file.
|
key in the configuration file.
|
||||||
- **language:** The main language of the book, which is used as a language attribute `<html lang="en">` for example.
|
- **language:** The main language of the book, which is used as a language attribute `<html lang="en">` for example.
|
||||||
- **edition**: Rust edition to use by default for the code snippets. Defaults to `rustdoc` defaults (2015).
|
|
||||||
|
|
||||||
**book.toml**
|
**book.toml**
|
||||||
```toml
|
```toml
|
||||||
|
@ -54,9 +55,14 @@ authors = ["John Doe", "Jane Doe"]
|
||||||
description = "The example book covers examples."
|
description = "The example book covers examples."
|
||||||
src = "my-src" # the source files will be found in `root/my-src` instead of `root/src`
|
src = "my-src" # the source files will be found in `root/my-src` instead of `root/src`
|
||||||
language = "en"
|
language = "en"
|
||||||
edition = "2018"
|
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### Rust options
|
||||||
|
|
||||||
|
Options for the Rust compiler used for playpen.
|
||||||
|
|
||||||
|
- **edition**: Rust edition to use by default for the code snippets. Defaults to `rustdoc` defaults (2015).
|
||||||
|
|
||||||
### Build options
|
### Build options
|
||||||
|
|
||||||
This controls the build process of your book.
|
This controls the build process of your book.
|
||||||
|
|
|
@ -265,7 +265,7 @@ impl MDBook {
|
||||||
let mut cmd = Command::new("rustdoc");
|
let mut cmd = Command::new("rustdoc");
|
||||||
cmd.arg(&path).arg("--test").args(&library_args);
|
cmd.arg(&path).arg("--test").args(&library_args);
|
||||||
|
|
||||||
if let Some(edition) = self.config.book.edition {
|
if let Some(edition) = self.config.rust.edition {
|
||||||
match edition {
|
match edition {
|
||||||
RustEdition::E2015 => {
|
RustEdition::E2015 => {
|
||||||
cmd.args(&["--edition", "2015"]);
|
cmd.args(&["--edition", "2015"]);
|
||||||
|
|
|
@ -72,6 +72,8 @@ pub struct Config {
|
||||||
pub book: BookConfig,
|
pub book: BookConfig,
|
||||||
/// Information about the build environment.
|
/// Information about the build environment.
|
||||||
pub build: BuildConfig,
|
pub build: BuildConfig,
|
||||||
|
/// Information passed to the Rust playground
|
||||||
|
pub rust: RustConfig,
|
||||||
rest: Value,
|
rest: Value,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -280,6 +282,7 @@ impl Default for Config {
|
||||||
Config {
|
Config {
|
||||||
book: BookConfig::default(),
|
book: BookConfig::default(),
|
||||||
build: BuildConfig::default(),
|
build: BuildConfig::default(),
|
||||||
|
rust: RustConfig::default(),
|
||||||
rest: Value::Table(Table::default()),
|
rest: Value::Table(Table::default()),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -320,9 +323,15 @@ impl<'de> Deserialize<'de> for Config {
|
||||||
.and_then(|value| value.try_into().ok())
|
.and_then(|value| value.try_into().ok())
|
||||||
.unwrap_or_default();
|
.unwrap_or_default();
|
||||||
|
|
||||||
|
let rust: RustConfig = table
|
||||||
|
.remove("rust")
|
||||||
|
.and_then(|value| value.try_into().ok())
|
||||||
|
.unwrap_or_default();
|
||||||
|
|
||||||
Ok(Config {
|
Ok(Config {
|
||||||
book,
|
book,
|
||||||
build,
|
build,
|
||||||
|
rust,
|
||||||
rest: Value::Table(table),
|
rest: Value::Table(table),
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
@ -393,8 +402,6 @@ pub struct BookConfig {
|
||||||
pub multilingual: bool,
|
pub multilingual: bool,
|
||||||
/// The main language of the book.
|
/// The main language of the book.
|
||||||
pub language: Option<String>,
|
pub language: Option<String>,
|
||||||
/// Rust edition to use for the code.
|
|
||||||
pub edition: Option<RustEdition>,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Default for BookConfig {
|
impl Default for BookConfig {
|
||||||
|
@ -406,11 +413,42 @@ impl Default for BookConfig {
|
||||||
src: PathBuf::from("src"),
|
src: PathBuf::from("src"),
|
||||||
multilingual: false,
|
multilingual: false,
|
||||||
language: Some(String::from("en")),
|
language: Some(String::from("en")),
|
||||||
edition: None,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Configuration for the build procedure.
|
||||||
|
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
|
||||||
|
#[serde(default, rename_all = "kebab-case")]
|
||||||
|
pub struct BuildConfig {
|
||||||
|
/// Where to put built artefacts relative to the book's root directory.
|
||||||
|
pub build_dir: PathBuf,
|
||||||
|
/// Should non-existent markdown files specified in `SUMMARY.md` be created
|
||||||
|
/// if they don't exist?
|
||||||
|
pub create_missing: bool,
|
||||||
|
/// Should the default preprocessors always be used when they are
|
||||||
|
/// compatible with the renderer?
|
||||||
|
pub use_default_preprocessors: bool,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Default for BuildConfig {
|
||||||
|
fn default() -> BuildConfig {
|
||||||
|
BuildConfig {
|
||||||
|
build_dir: PathBuf::from("book"),
|
||||||
|
create_missing: true,
|
||||||
|
use_default_preprocessors: true,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Configuration for the Rust compiler(e.g., for playpen)
|
||||||
|
#[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize)]
|
||||||
|
#[serde(default, rename_all = "kebab-case")]
|
||||||
|
pub struct RustConfig {
|
||||||
|
/// Rust edition used in playpen
|
||||||
|
pub edition: Option<RustEdition>,
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Debug, Copy, Clone, PartialEq)]
|
#[derive(Debug, Copy, Clone, PartialEq)]
|
||||||
/// Rust edition to use for the code.
|
/// Rust edition to use for the code.
|
||||||
pub enum RustEdition {
|
pub enum RustEdition {
|
||||||
|
@ -451,8 +489,8 @@ impl<'de> Deserialize<'de> for RustEdition {
|
||||||
let edition = match edition.as_str() {
|
let edition = match edition.as_str() {
|
||||||
"2018" => RustEdition::E2018,
|
"2018" => RustEdition::E2018,
|
||||||
"2015" => RustEdition::E2015,
|
"2015" => RustEdition::E2015,
|
||||||
_ => {
|
e => {
|
||||||
return Err(D::Error::custom("Unknown Rust edition"));
|
return Err(D::Error::custom(format!("Unknown Rust edition: {}", e)));
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -460,30 +498,6 @@ impl<'de> Deserialize<'de> for RustEdition {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Configuration for the build procedure.
|
|
||||||
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
|
|
||||||
#[serde(default, rename_all = "kebab-case")]
|
|
||||||
pub struct BuildConfig {
|
|
||||||
/// Where to put built artefacts relative to the book's root directory.
|
|
||||||
pub build_dir: PathBuf,
|
|
||||||
/// Should non-existent markdown files specified in `SUMMARY.md` be created
|
|
||||||
/// if they don't exist?
|
|
||||||
pub create_missing: bool,
|
|
||||||
/// Should the default preprocessors always be used when they are
|
|
||||||
/// compatible with the renderer?
|
|
||||||
pub use_default_preprocessors: bool,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Default for BuildConfig {
|
|
||||||
fn default() -> BuildConfig {
|
|
||||||
BuildConfig {
|
|
||||||
build_dir: PathBuf::from("book"),
|
|
||||||
create_missing: true,
|
|
||||||
use_default_preprocessors: true,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Configuration for the HTML renderer.
|
/// Configuration for the HTML renderer.
|
||||||
#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
|
#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
|
||||||
#[serde(default, rename_all = "kebab-case")]
|
#[serde(default, rename_all = "kebab-case")]
|
||||||
|
@ -699,13 +713,13 @@ mod tests {
|
||||||
multilingual: true,
|
multilingual: true,
|
||||||
src: PathBuf::from("source"),
|
src: PathBuf::from("source"),
|
||||||
language: Some(String::from("ja")),
|
language: Some(String::from("ja")),
|
||||||
edition: None,
|
|
||||||
};
|
};
|
||||||
let build_should_be = BuildConfig {
|
let build_should_be = BuildConfig {
|
||||||
build_dir: PathBuf::from("outputs"),
|
build_dir: PathBuf::from("outputs"),
|
||||||
create_missing: false,
|
create_missing: false,
|
||||||
use_default_preprocessors: true,
|
use_default_preprocessors: true,
|
||||||
};
|
};
|
||||||
|
let rust_should_be = RustConfig { edition: None };
|
||||||
let playpen_should_be = Playpen {
|
let playpen_should_be = Playpen {
|
||||||
editable: true,
|
editable: true,
|
||||||
copyable: true,
|
copyable: true,
|
||||||
|
@ -728,6 +742,7 @@ mod tests {
|
||||||
|
|
||||||
assert_eq!(got.book, book_should_be);
|
assert_eq!(got.book, book_should_be);
|
||||||
assert_eq!(got.build, build_should_be);
|
assert_eq!(got.build, build_should_be);
|
||||||
|
assert_eq!(got.rust, rust_should_be);
|
||||||
assert_eq!(got.html_config().unwrap(), html_should_be);
|
assert_eq!(got.html_config().unwrap(), html_should_be);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -739,6 +754,7 @@ mod tests {
|
||||||
description = "Create book from markdown files. Like Gitbook but implemented in Rust"
|
description = "Create book from markdown files. Like Gitbook but implemented in Rust"
|
||||||
authors = ["Mathieu David"]
|
authors = ["Mathieu David"]
|
||||||
src = "./source"
|
src = "./source"
|
||||||
|
[rust]
|
||||||
edition = "2015"
|
edition = "2015"
|
||||||
"#;
|
"#;
|
||||||
|
|
||||||
|
@ -749,12 +765,17 @@ mod tests {
|
||||||
)),
|
)),
|
||||||
authors: vec![String::from("Mathieu David")],
|
authors: vec![String::from("Mathieu David")],
|
||||||
src: PathBuf::from("./source"),
|
src: PathBuf::from("./source"),
|
||||||
edition: Some(RustEdition::E2015),
|
|
||||||
..Default::default()
|
..Default::default()
|
||||||
};
|
};
|
||||||
|
|
||||||
let got = Config::from_str(src).unwrap();
|
let got = Config::from_str(src).unwrap();
|
||||||
assert_eq!(got.book, book_should_be);
|
assert_eq!(got.book, book_should_be);
|
||||||
|
|
||||||
|
let rust_should_be = RustConfig {
|
||||||
|
edition: Some(RustEdition::E2015),
|
||||||
|
};
|
||||||
|
let got = Config::from_str(src).unwrap();
|
||||||
|
assert_eq!(got.rust, rust_should_be);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
|
@ -765,22 +786,16 @@ mod tests {
|
||||||
description = "Create book from markdown files. Like Gitbook but implemented in Rust"
|
description = "Create book from markdown files. Like Gitbook but implemented in Rust"
|
||||||
authors = ["Mathieu David"]
|
authors = ["Mathieu David"]
|
||||||
src = "./source"
|
src = "./source"
|
||||||
|
[rust]
|
||||||
edition = "2018"
|
edition = "2018"
|
||||||
"#;
|
"#;
|
||||||
|
|
||||||
let book_should_be = BookConfig {
|
let rust_should_be = RustConfig {
|
||||||
title: Some(String::from("mdBook Documentation")),
|
|
||||||
description: Some(String::from(
|
|
||||||
"Create book from markdown files. Like Gitbook but implemented in Rust",
|
|
||||||
)),
|
|
||||||
authors: vec![String::from("Mathieu David")],
|
|
||||||
src: PathBuf::from("./source"),
|
|
||||||
edition: Some(RustEdition::E2018),
|
edition: Some(RustEdition::E2018),
|
||||||
..Default::default()
|
|
||||||
};
|
};
|
||||||
|
|
||||||
let got = Config::from_str(src).unwrap();
|
let got = Config::from_str(src).unwrap();
|
||||||
assert_eq!(got.book, book_should_be);
|
assert_eq!(got.rust, rust_should_be);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
|
|
|
@ -349,7 +349,7 @@ impl Renderer for HtmlHandlebars {
|
||||||
data: data.clone(),
|
data: data.clone(),
|
||||||
is_index,
|
is_index,
|
||||||
html_config: html_config.clone(),
|
html_config: html_config.clone(),
|
||||||
edition: ctx.config.book.edition,
|
edition: ctx.config.rust.edition,
|
||||||
};
|
};
|
||||||
self.render_item(item, ctx, &mut print_content)?;
|
self.render_item(item, ctx, &mut print_content)?;
|
||||||
is_index = false;
|
is_index = false;
|
||||||
|
@ -365,7 +365,7 @@ impl Renderer for HtmlHandlebars {
|
||||||
debug!("Render template");
|
debug!("Render template");
|
||||||
let rendered = handlebars.render("index", &data)?;
|
let rendered = handlebars.render("index", &data)?;
|
||||||
|
|
||||||
let rendered = self.post_process(rendered, &html_config.playpen, ctx.config.book.edition);
|
let rendered = self.post_process(rendered, &html_config.playpen, ctx.config.rust.edition);
|
||||||
|
|
||||||
utils::fs::write_file(&destination, "print.html", rendered.as_bytes())?;
|
utils::fs::write_file(&destination, "print.html", rendered.as_bytes())?;
|
||||||
debug!("Creating print.html ✓");
|
debug!("Creating print.html ✓");
|
||||||
|
|
Loading…
Reference in New Issue