fuels_rs/code_gen/bindings.rs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
use crate::errors::Error;
use crate::rustfmt;
use proc_macro2::TokenStream;
use std::{fs::File, io::Write, path::Path};
/// Type-safe contract bindings generated by a `Builder`. This type can be
/// either written to file or into a token stream for use in a procedural macro.
pub struct ContractBindings {
/// The TokenStream representing the contract bindings.
pub tokens: TokenStream,
/// The output options used for serialization.
pub rustfmt: bool,
}
impl ContractBindings {
/// Writes the bindings to a given `Write`.
pub fn write<W>(&self, mut w: W) -> Result<(), Error>
where
W: Write,
{
let source = {
let raw = self.tokens.to_string();
if self.rustfmt {
rustfmt::format(&raw).unwrap_or(raw)
} else {
raw
}
};
w.write_all(source.as_bytes()).unwrap();
Ok(())
}
/// Writes the bindings to the specified file.
pub fn write_to_file<P>(&self, path: P) -> Result<(), Error>
where
P: AsRef<Path>,
{
let file = File::create(path).unwrap();
self.write(file)
}
/// Converts the bindings into its underlying token stream. This allows it
/// to be used within a procedural macro.
pub fn into_tokens(self) -> TokenStream {
self.tokens
}
}