Factor out enum qualified name formatter
diff --git a/macro/src/clang.rs b/macro/src/clang.rs
index 6f9a90a..678850d 100644
--- a/macro/src/clang.rs
+++ b/macro/src/clang.rs
@@ -6,6 +6,7 @@
use quote::{format_ident, quote};
use serde::Deserialize;
use std::env;
+use std::fmt::{self, Display};
use std::fs;
use std::path::PathBuf;
use std::str::FromStr;
@@ -100,12 +101,8 @@
for enm in variants_from_header {
if enm.variants.is_empty() {
let span = &enm.variants_from_header_attr;
- let mut msg = "failed to find any C++ definition of enum ".to_owned();
- for name in &enm.name.namespace {
- msg += &name.to_string();
- msg += "::";
- }
- msg += &enm.name.cxx.to_string();
+ let name = CxxName(&enm.name);
+ let msg = format!("failed to find any C++ definition of enum {}", name);
cx.error(span, msg);
}
}
@@ -141,12 +138,8 @@
break;
} else {
let span = &enm.variants_from_header_attr;
- let mut msg = "found multiple C++ definitions of enum ".to_owned();
- for name in &enm.name.namespace {
- msg += &name.to_string();
- msg += "::";
- }
- msg += &enm.name.cxx.to_string();
+ let name = CxxName(&enm.name);
+ let msg = format!("found multiple C++ definitions of enum {}", name);
cx.error(span, msg);
return;
}
@@ -264,3 +257,15 @@
brace_token.set_span(enm.brace_token.span);
quote!(#enum_token #brace_token)
}
+
+struct CxxName<'a>(&'a Pair);
+
+impl<'a> Display for CxxName<'a> {
+ fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
+ for namespace in &self.0.namespace {
+ Display::fmt(namespace, formatter)?;
+ formatter.write_str("::")?;
+ }
+ Display::fmt(&self.0.cxx, formatter)
+ }
+}