1
0
Fork 0
forked from wry/wry

wire: don't use BStr in generator

This commit is contained in:
Julian Orth 2024-04-08 12:33:53 +02:00
parent 5e8b69c909
commit d46462dfdd
2 changed files with 24 additions and 25 deletions

View file

@ -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;

View file

@ -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(())