wire: don't use BStr in generator
This commit is contained in:
parent
5e8b69c909
commit
d46462dfdd
2 changed files with 24 additions and 25 deletions
|
|
@ -10,7 +10,8 @@
|
||||||
clippy::too_many_arguments,
|
clippy::too_many_arguments,
|
||||||
clippy::iter_skip_next,
|
clippy::iter_skip_next,
|
||||||
clippy::uninlined_format_args,
|
clippy::uninlined_format_args,
|
||||||
clippy::manual_is_ascii_check
|
clippy::manual_is_ascii_check,
|
||||||
|
clippy::single_char_pattern
|
||||||
)]
|
)]
|
||||||
|
|
||||||
extern crate core;
|
extern crate core;
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,6 @@
|
||||||
use {
|
use {
|
||||||
crate::open,
|
crate::open,
|
||||||
anyhow::{bail, Context, Result},
|
anyhow::{bail, Context, Result},
|
||||||
bstr::{BStr, BString, ByteSlice},
|
|
||||||
std::{fs::DirEntry, io::Write, os::unix::ffi::OsStrExt},
|
std::{fs::DirEntry, io::Write, os::unix::ffi::OsStrExt},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -52,7 +51,7 @@ struct Token<'a> {
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
enum TokenKind<'a> {
|
enum TokenKind<'a> {
|
||||||
Ident(&'a BStr),
|
Ident(&'a str),
|
||||||
#[allow(dead_code)]
|
#[allow(dead_code)]
|
||||||
Num(u32),
|
Num(u32),
|
||||||
Tree {
|
Tree {
|
||||||
|
|
@ -143,7 +142,7 @@ impl<'a> Tokenizer<'a> {
|
||||||
while !c.eof() && matches!(c.s[c.pos], b'a'..=b'z' | b'_' | b'0'..=b'9') {
|
while !c.eof() && matches!(c.s[c.pos], b'a'..=b'z' | b'_' | b'0'..=b'9') {
|
||||||
c.pos += 1;
|
c.pos += 1;
|
||||||
}
|
}
|
||||||
TokenKind::Ident(c.s[b_pos..c.pos].as_bstr())
|
TokenKind::Ident(std::str::from_utf8(&c.s[b_pos..c.pos])?)
|
||||||
}
|
}
|
||||||
b'0'..=b'9' => {
|
b'0'..=b'9' => {
|
||||||
c.pos -= 1;
|
c.pos -= 1;
|
||||||
|
|
@ -210,7 +209,7 @@ struct Lined<T> {
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
enum Type {
|
enum Type {
|
||||||
Id(BString),
|
Id(String),
|
||||||
U32,
|
U32,
|
||||||
I32,
|
I32,
|
||||||
Str,
|
Str,
|
||||||
|
|
@ -219,19 +218,19 @@ enum Type {
|
||||||
Fixed,
|
Fixed,
|
||||||
Fd,
|
Fd,
|
||||||
Array(Box<Type>),
|
Array(Box<Type>),
|
||||||
Pod(BString),
|
Pod(String),
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
struct Field {
|
struct Field {
|
||||||
name: BString,
|
name: String,
|
||||||
ty: Lined<Type>,
|
ty: Lined<Type>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
struct Message {
|
struct Message {
|
||||||
name: BString,
|
name: String,
|
||||||
camel_name: BString,
|
camel_name: String,
|
||||||
id: u32,
|
id: u32,
|
||||||
fields: Vec<Lined<Field>>,
|
fields: Vec<Lined<Field>>,
|
||||||
}
|
}
|
||||||
|
|
@ -324,7 +323,7 @@ impl<'a> Parser<'a> {
|
||||||
res.with_context(|| format!("While parsing field starting at line {}", line))
|
res.with_context(|| format!("While parsing field starting at line {}", line))
|
||||||
}
|
}
|
||||||
|
|
||||||
fn expect_ident(&mut self) -> Result<(u32, &'a BStr)> {
|
fn expect_ident(&mut self) -> Result<(u32, &'a str)> {
|
||||||
self.not_eof()?;
|
self.not_eof()?;
|
||||||
let token = &self.tokens[self.pos];
|
let token = &self.tokens[self.pos];
|
||||||
self.pos += 1;
|
self.pos += 1;
|
||||||
|
|
@ -392,8 +391,8 @@ impl<'a> Parser<'a> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn parse_rust_path(&mut self) -> Result<Lined<BString>> {
|
fn parse_rust_path(&mut self) -> Result<Lined<String>> {
|
||||||
let mut path = Vec::new();
|
let mut path = String::new();
|
||||||
let mut line = None;
|
let mut line = None;
|
||||||
loop {
|
loop {
|
||||||
self.not_eof()?;
|
self.not_eof()?;
|
||||||
|
|
@ -401,17 +400,17 @@ impl<'a> Parser<'a> {
|
||||||
if line.is_none() {
|
if line.is_none() {
|
||||||
line = Some(l);
|
line = Some(l);
|
||||||
}
|
}
|
||||||
path.extend_from_slice(id.as_bytes());
|
path.push_str(id);
|
||||||
if self.eof() {
|
if self.eof() {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
self.expect_symbol(Symbol::Colon)?;
|
self.expect_symbol(Symbol::Colon)?;
|
||||||
self.expect_symbol(Symbol::Colon)?;
|
self.expect_symbol(Symbol::Colon)?;
|
||||||
path.extend_from_slice(b"::");
|
path.push_str("::");
|
||||||
}
|
}
|
||||||
Ok(Lined {
|
Ok(Lined {
|
||||||
line: line.unwrap(),
|
line: line.unwrap(),
|
||||||
val: path.into(),
|
val: path,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -494,9 +493,9 @@ fn parse_messages(s: &[u8]) -> Result<Vec<Lined<Message>>> {
|
||||||
parser.parse()
|
parser.parse()
|
||||||
}
|
}
|
||||||
|
|
||||||
fn to_camel(s: &BStr) -> BString {
|
fn to_camel(s: &str) -> String {
|
||||||
let mut last_was_underscore = true;
|
let mut last_was_underscore = true;
|
||||||
let mut res = vec![];
|
let mut res = String::new();
|
||||||
for mut b in s.as_bytes().iter().copied() {
|
for mut b in s.as_bytes().iter().copied() {
|
||||||
if b == b'_' {
|
if b == b'_' {
|
||||||
last_was_underscore = true;
|
last_was_underscore = true;
|
||||||
|
|
@ -504,11 +503,11 @@ fn to_camel(s: &BStr) -> BString {
|
||||||
if last_was_underscore {
|
if last_was_underscore {
|
||||||
b = b.to_ascii_uppercase()
|
b = b.to_ascii_uppercase()
|
||||||
}
|
}
|
||||||
res.push(b);
|
res.push(b as char);
|
||||||
last_was_underscore = false;
|
last_was_underscore = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
res.into()
|
res
|
||||||
}
|
}
|
||||||
|
|
||||||
fn write_type<W: Write>(f: &mut W, ty: &Type) -> Result<()> {
|
fn write_type<W: Write>(f: &mut W, ty: &Type) -> Result<()> {
|
||||||
|
|
@ -540,7 +539,7 @@ fn write_field<W: Write>(f: &mut W, field: &Field) -> Result<()> {
|
||||||
|
|
||||||
fn write_message_type<W: Write>(
|
fn write_message_type<W: Write>(
|
||||||
f: &mut W,
|
f: &mut W,
|
||||||
obj: &BStr,
|
obj: &str,
|
||||||
message: &Message,
|
message: &Message,
|
||||||
needs_lifetime: bool,
|
needs_lifetime: bool,
|
||||||
) -> Result<()> {
|
) -> Result<()> {
|
||||||
|
|
@ -581,13 +580,12 @@ fn write_message_type<W: Write>(
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
fn write_message<W: Write>(f: &mut W, obj: &BStr, message: &Message) -> Result<()> {
|
fn write_message<W: Write>(f: &mut W, obj: &str, message: &Message) -> Result<()> {
|
||||||
let has_reference_type = message.fields.iter().any(|f| match &f.val.ty.val {
|
let has_reference_type = message.fields.iter().any(|f| match &f.val.ty.val {
|
||||||
Type::OptStr | Type::Str | Type::BStr | Type::Array(..) => true,
|
Type::OptStr | Type::Str | Type::BStr | Type::Array(..) => true,
|
||||||
_ => false,
|
_ => false,
|
||||||
});
|
});
|
||||||
let uppercase = message.name.to_ascii_uppercase();
|
let uppercase = message.name.to_ascii_uppercase();
|
||||||
let uppercase = uppercase.as_bstr();
|
|
||||||
writeln!(f)?;
|
writeln!(f)?;
|
||||||
writeln!(f, " pub const {}: u32 = {};", uppercase, message.id)?;
|
writeln!(f, " pub const {}: u32 = {};", uppercase, message.id)?;
|
||||||
write_message_type(f, obj, message, has_reference_type)?;
|
write_message_type(f, obj, message, has_reference_type)?;
|
||||||
|
|
@ -681,9 +679,9 @@ fn write_message<W: Write>(f: &mut W, obj: &BStr, message: &Message) -> Result<(
|
||||||
|
|
||||||
fn write_file<W: Write>(f: &mut W, file: &DirEntry) -> Result<()> {
|
fn write_file<W: Write>(f: &mut W, file: &DirEntry) -> Result<()> {
|
||||||
let file_name = file.file_name();
|
let file_name = file.file_name();
|
||||||
let file_name = file_name.as_bytes().as_bstr();
|
let file_name = std::str::from_utf8(file_name.as_bytes())?;
|
||||||
println!("cargo:rerun-if-changed=wire/{}", file_name);
|
println!("cargo:rerun-if-changed=wire/{}", file_name);
|
||||||
let obj_name = file_name.split_str(".").next().unwrap().as_bstr();
|
let obj_name = file_name.split(".").next().unwrap();
|
||||||
let camel_obj_name = to_camel(obj_name);
|
let camel_obj_name = to_camel(obj_name);
|
||||||
writeln!(f)?;
|
writeln!(f)?;
|
||||||
writeln!(f, "id!({}Id);", camel_obj_name)?;
|
writeln!(f, "id!({}Id);", camel_obj_name)?;
|
||||||
|
|
@ -702,7 +700,7 @@ fn write_file<W: Write>(f: &mut W, file: &DirEntry) -> Result<()> {
|
||||||
writeln!(f, "pub mod {} {{", obj_name)?;
|
writeln!(f, "pub mod {} {{", obj_name)?;
|
||||||
writeln!(f, " use super::*;")?;
|
writeln!(f, " use super::*;")?;
|
||||||
for message in &messages {
|
for message in &messages {
|
||||||
write_message(f, camel_obj_name.as_bstr(), &message.val)?;
|
write_message(f, &camel_obj_name, &message.val)?;
|
||||||
}
|
}
|
||||||
writeln!(f, "}}")?;
|
writeln!(f, "}}")?;
|
||||||
Ok(())
|
Ok(())
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue