mirror of
https://github.com/orhun/systeroid
synced 2024-10-01 13:13:32 +00:00
refactor(project): move parser to another workspace
This commit is contained in:
parent
1927fa69fc
commit
6937c6ca7f
11
Cargo.lock
generated
11
Cargo.lock
generated
|
@ -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",
|
||||
|
|
34
Cargo.toml
34
Cargo.toml
|
@ -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"
|
||||
]
|
||||
|
|
9
kparams-parser/Cargo.toml
Normal file
9
kparams-parser/Cargo.toml
Normal 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"
|
|
@ -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
15
kparams-parser/src/lib.rs
Normal 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;
|
|
@ -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)
|
||||
}
|
|
@ -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)? {
|
|
@ -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
11
kparams/Cargo.toml
Normal 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"
|
|
@ -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);
|
|
@ -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
|
|
@ -1,3 +0,0 @@
|
|||
fn main() {
|
||||
kparams::run();
|
||||
}
|
Loading…
Reference in a new issue