in tensorflow-op-codegen/src/main.rs [364:490]
fn main() -> Result<(), Box<dyn Error>> {
let args: Vec<String> = env::args().collect();
let tensorflow_folder = Path::new(&args[1]);
let output_folder = Path::new(&args[2]);
let ops_bytes = fs::read(
tensorflow_folder
.join("tensorflow/core/ops/ops.pbtxt")
.to_str()
.ok_or("Unable to format path for tensorflow folder")?,
)?;
let ops = parser::parse(&ops_bytes).map_err(|e| {
println!("Parse error at {:?}", e.pos);
if let Some(p) = &e.pos {
let input = String::from_utf8_lossy(&ops_bytes);
println!("Previous: {}", &input[0..*p]);
println!("Next: {}", &input[*p..]);
}
e
})?;
let keywords: HashSet<String> = [
"abstract",
"as",
"async",
"await",
"become",
"box",
"break",
"const",
"continue",
"crate",
"do",
"dyn",
"else",
"enum",
"extern",
"false",
"final",
"fn",
"for",
"if",
"impl",
"in",
"let",
"loop",
"macro",
"match",
"mod",
"move",
"mut",
"override",
"priv",
"pub",
"ref",
"return",
"self",
"Self",
"static",
"struct",
"super",
"trait",
"true",
"try",
"type",
"typeof",
"unsafe",
"unsized",
"use",
"virtual",
"where",
"while",
"yield",
// These aren't technically keywords, but there doesn't appear to be a
// way to refer to these types (e.g. qualified type names) if the name
// has been shadowed by something else, so we treat them as keywords.
"bool",
"char",
"f32",
"f64",
"i8",
"i16",
"i32",
"i64",
"i128",
"isize",
"str",
"u8",
"u16",
"u32",
"u64",
"u128",
"usize",
// build, new, and add_control_input aren't keywords, but they still
// can't be used because they would clash with methods we're providing.
"build",
"new",
"add_control_input",
]
.iter()
.map(|s| s.to_string())
.collect();
let mut out = BufWriter::new(File::create(output_folder.join("src/ops/ops_impl.rs"))?);
write!(
&mut out,
"{}",
r#"// DO NOT EDIT. Generated by tensorflow-op-codegen/src/main.rs.
#![allow(
non_snake_case,
trivial_casts,
unused_parens,
unused_qualifications
)]
"#
)?;
let mut fn_escaper = Escaper::new(&keywords);
let mut struct_escaper = Escaper::new(&keywords);
for op in ops {
define_op(
&mut out,
&keywords,
&mut fn_escaper,
&mut struct_escaper,
&op,
)?;
}
Ok(())
}