#![doc(hidden)] use std::fs; use std::io; use std::path::Path; use protobuf::descriptor::FileDescriptorProto; use protobuf_parse::ProtoPathBuf; use crate::customize::CustomizeCallback; use crate::gen::all::gen_all; use crate::Customize; #[derive(Debug, thiserror::Error)] enum Error { #[error("output path `{0}` is not a directory")] OutputIsNotDirectory(String), #[error("output path `{0}` does not exist or not accessible")] OutputDoesNotExistOrNotAccssible(String, #[source] io::Error), #[error("failed to create file `{0}`: {1}")] FailedToWriteFile(String, #[source] io::Error), } #[doc(hidden)] pub fn gen_and_write( file_descriptors: &[FileDescriptorProto], parser: &str, files_to_generate: &[ProtoPathBuf], out_dir: &Path, customize: &Customize, customize_callback: &dyn CustomizeCallback, ) -> anyhow::Result<()> { match out_dir.metadata() { Ok(m) => { if !m.is_dir() { return Err(Error::OutputIsNotDirectory(out_dir.display().to_string()).into()); } } Err(e) => { return Err( Error::OutputDoesNotExistOrNotAccssible(out_dir.display().to_string(), e).into(), ); } } let results = gen_all( file_descriptors, parser, files_to_generate, customize, customize_callback, )?; for r in &results { let mut file_path = out_dir.to_owned(); file_path.push(&r.name); fs::write(&file_path, r.content.as_slice()) .map_err(|e| Error::FailedToWriteFile(file_path.display().to_string(), e))?; } Ok(()) }