refactor(project): move parser to another workspace

This commit is contained in:
Orhun Parmaksız 2021-10-04 21:21:54 +03:00
parent 1927fa69fc
commit 6937c6ca7f
No known key found for this signature in database
GPG key ID: F83424824B3E4B90
12 changed files with 76 additions and 64 deletions

11
Cargo.lock generated
View file

@ -62,6 +62,13 @@ dependencies = [
[[package]]
name = "kparams"
version = "0.1.0"
dependencies = [
"kparams-parser",
]
[[package]]
name = "kparams-parser"
version = "0.1.0"
dependencies = [
"pest",
"pest_derive",
@ -154,9 +161,9 @@ dependencies = [
[[package]]
name = "syn"
version = "1.0.77"
version = "1.0.78"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5239bc68e0fef57495900cfea4e8dc75596d9a319d7e16b1e0a440d24e6fe0a0"
checksum = "a4eac2e6c19f5c3abc0c229bea31ff0b9b091c7b14990e8924b92902a303a0c0"
dependencies = [
"proc-macro2",
"quote",

View file

@ -1,29 +1,5 @@
[package]
name = "kparams"
version = "0.1.0"
authors = ["Orhun Parmaksız <orhunparmaksiz@gmail.com>"]
edition = "2021"
[dependencies]
pest = "2.1.3"
pest_derive = "2.1.0"
[profile.dev]
opt-level = 0
debug = true
panic = "abort"
[profile.test]
opt-level = 0
debug = true
[profile.release]
opt-level = 3
debug = false
panic = "abort"
lto = true
codegen-units = 1
[profile.bench]
opt-level = 3
debug = false
[workspace]
members = [
"kparams-parser",
"kparams"
]

View file

@ -0,0 +1,9 @@
[package]
name = "kparams-parser"
version = "0.1.0"
authors = ["Orhun Parmaksız <orhunparmaksiz@gmail.com>"]
edition = "2021"
[dependencies]
pest = "2.1.3"
pest_derive = "2.1.0"

View file

@ -1,5 +1,3 @@
//! Linux kernel types.
/// Documentation of the Linux kernel.
#[derive(Clone, Debug)]
pub struct Documentation<'a> {

15
kparams-parser/src/lib.rs Normal file
View file

@ -0,0 +1,15 @@
//! kparams-parser
#![warn(missing_docs, clippy::unwrap_used)]
/// Linux kernel types.
pub mod kernel;
/// RST parser.
pub mod parser;
/// File reader.
pub mod reader;
#[macro_use]
extern crate pest_derive;

View file

@ -1,15 +1,20 @@
#![allow(missing_docs)] // pest_derive does not have doc comments.
use crate::kernel::{Documentation, Parameter};
use pest::Parser;
use pest::Token;
/// Taken from <https://github.com/flying-sheep/rust-rst/blob/master/parser/src/rst.pest>
/// Parser for the reStructuredText format.
#[derive(Parser)]
#[grammar = "rst.pest"]
pub struct RstParser;
impl RstParser {
pub fn parse_input(input: &str) -> Documentation {
let rst_document = Self::parse(Rule::document, input).expect("unsuccessful parse");
/// Parses the given reStructuredText input and returns the [`kernel documentation`].
///
/// [`kernel documentation`]: Documentation
pub fn parse_docs(input: &str) -> Documentation {
let rst_document = Self::parse(Rule::document, input).expect("failed to parse document");
let mut kernel_parameters = Vec::new();
let titles = rst_document
.filter(|block| block.as_rule() == Rule::title)
@ -33,14 +38,11 @@ impl RstParser {
.collect::<Vec<(&str, Vec<usize>)>>();
for (i, (title, pos)) in titles.iter().enumerate() {
assert_eq!(2, pos.len());
if let Some(next_title) = titles.get(i + 1) {
kernel_parameters.push(Parameter::new(
*title,
(input[pos[1]..next_title.1[0]]).as_ref(),
));
kernel_parameters.push(if let Some(next_title) = titles.get(i + 1) {
Parameter::new(*title, (input[pos[1]..next_title.1[0]]).as_ref())
} else {
kernel_parameters.push(Parameter::new(*title, (input[pos[1]..]).as_ref()));
};
Parameter::new(*title, (input[pos[1]..]).as_ref())
});
}
Documentation::new(kernel_parameters)
}

View file

@ -3,22 +3,27 @@ use std::io::{BufRead, BufReader as IoBufReader, Result as IoResult};
use std::path::Path;
use std::rc::Rc;
/// Default buffer size of the reader.
const DEFAULT_BUFFER_SIZE: usize = 1024;
/// Buffered reader.
pub struct BufReader {
/// Inner type.
reader: IoBufReader<File>,
/// Buffer.
buffer: Rc<String>,
}
impl BufReader {
/// Opens the given file and initializes the buffered reader with given buffer size.
pub fn open(path: impl AsRef<Path>, buffer_size: Option<usize>) -> IoResult<Self> {
let file = File::open(path)?;
let reader = IoBufReader::new(file);
let buffer = Self::new_buffer(buffer_size);
Ok(Self { reader, buffer })
}
/// Creates a new buffer with the given size.
fn new_buffer(buffer_size: Option<usize>) -> Rc<String> {
Rc::new(String::with_capacity(
buffer_size.unwrap_or(DEFAULT_BUFFER_SIZE),
@ -28,7 +33,6 @@ impl BufReader {
impl Iterator for BufReader {
type Item = IoResult<Rc<String>>;
fn next(&mut self) -> Option<Self::Item> {
let buffer = match Rc::get_mut(&mut self.buffer) {
Some(rc_buffer) => {
@ -53,6 +57,9 @@ impl Iterator for BufReader {
}
}
/// Reads the contents of the file into a string.
///
/// Uses [`BufReader`] under the hood.
pub fn read_to_string(path: &Path) -> IoResult<String> {
let mut lines = Vec::<String>::new();
for line in BufReader::open(path, None)? {

View file

@ -1,3 +1,5 @@
// Taken from https://github.com/flying-sheep/rust-rst/blob/master/parser/src/rst.pest
// Entry point: the document.
// This grammar is aligned to the doctree names when possible.

11
kparams/Cargo.toml Normal file
View file

@ -0,0 +1,11 @@
[package]
name = "kparams"
version = "0.1.0"
authors = ["Orhun Parmaksız <orhunparmaksiz@gmail.com>"]
edition = "2021"
[dependencies]
[dependencies.kparams-parser]
version = "0.1.0"
path = "../kparams-parser"

View file

@ -1,18 +1,13 @@
pub mod kernel;
pub mod parser;
pub mod reader;
#[macro_use]
extern crate pest_derive;
use parser::RstParser;
use kparams_parser::parser::RstParser;
use kparams_parser::reader;
use std::path::PathBuf;
pub fn run() {
fn main() {
let kernel_docs = PathBuf::from("/usr/share/doc/linux");
let sysctl_docs = kernel_docs.join("admin-guide").join("sysctl");
let kernel_section = reader::read_to_string(&sysctl_docs.join("kernel.rst")).unwrap();
let kernel_section_docs = RstParser::parse_input(&kernel_section);
let kernel_section_docs = RstParser::parse_docs(&kernel_section);
for kernel_parameter in kernel_section_docs.parameters {
println!("## {}", kernel_parameter.name);
println!("{}", kernel_parameter.description);

View file

@ -1,7 +0,0 @@
#!/usr/bin/env bash
set -e
metadata=$(cargo metadata --no-deps --format-version 1)
src_path=$(dirname $(jq -r '.packages[].targets[0].src_path' <<< "$metadata"))
wget -O "${src_path}/rst.pest" https://raw.githubusercontent.com/flying-sheep/rust-rst/master/parser/src/rst.pest

View file

@ -1,3 +0,0 @@
fn main() {
kparams::run();
}