use std::collections::HashSet;
use crate::generated::descriptor::FileDescriptorProto;
use proc_macro2::TokenStream;
use quote::quote;
const PRELUDE_NAMES: &[&str] = &["Option"];
pub(crate) struct ImportResolver {
blocked: HashSet<String>,
}
impl ImportResolver {
pub fn for_file(file: &FileDescriptorProto) -> Self {
let mut proto_names = HashSet::new();
for msg in &file.message_type {
if let Some(name) = &msg.name {
proto_names.insert(name.as_str());
}
}
for e in &file.enum_type {
if let Some(name) = &e.name {
proto_names.insert(name.as_str());
}
}
let mut blocked = HashSet::new();
for &name in PRELUDE_NAMES {
if proto_names.contains(name) {
blocked.insert(name.to_string());
}
}
Self { blocked }
}
pub fn generate_use_block(&self) -> TokenStream {
TokenStream::new()
}
fn is_available(&self, name: &str) -> bool {
!self.blocked.contains(name)
}
pub fn option(&self) -> TokenStream {
if self.is_available("Option") {
quote! { Option }
} else {
quote! { ::core::option::Option }
}
}
pub fn string(&self) -> TokenStream {
quote! { ::buffa::alloc::string::String }
}
pub fn vec(&self) -> TokenStream {
quote! { ::buffa::alloc::vec::Vec }
}
pub fn message_field(&self) -> TokenStream {
quote! { ::buffa::MessageField }
}
pub fn enum_value(&self) -> TokenStream {
quote! { ::buffa::EnumValue }
}
pub fn hashmap(&self) -> TokenStream {
quote! { ::buffa::__private::HashMap }
}
}