diff --git a/gen/src/write.rs b/gen/src/write.rs
index 098137e..e088e2c 100644
--- a/gen/src/write.rs
+++ b/gen/src/write.rs
@@ -58,20 +58,20 @@
         match api {
             Api::Struct(strct) => {
                 out.next_section();
-                write_struct(out, strct, namespace);
+                write_struct(out, strct);
             }
             Api::Enum(enm) => {
                 out.next_section();
                 if types.cxx.contains(&enm.ident) {
                     check_enum(out, enm);
                 } else {
-                    write_enum(out, enm, namespace);
+                    write_enum(out, enm);
                 }
             }
             Api::RustType(ety) => {
                 if let Some(methods) = methods_for_type.get(&ety.ident) {
                     out.next_section();
-                    write_struct_with_methods(out, ety, methods, namespace);
+                    write_struct_with_methods(out, ety, methods);
                 }
             }
             _ => {}
@@ -317,8 +317,8 @@
     out.end_block("namespace rust");
 }
 
-fn write_struct(out: &mut OutFile, strct: &Struct, namespace: &Namespace) {
-    write_include_guard_start(out, namespace, &strct.ident);
+fn write_struct(out: &mut OutFile, strct: &Struct) {
+    write_include_guard_start(out, &strct.ident);
     for line in strct.doc.to_string().lines() {
         writeln!(out, "//{}", line);
     }
@@ -329,7 +329,7 @@
         writeln!(out, "{};", field.ident);
     }
     writeln!(out, "}};");
-    write_include_guard_end(out, namespace, &strct.ident);
+    write_include_guard_end(out, &strct.ident);
 }
 
 fn write_struct_decl(out: &mut OutFile, ident: &Ident) {
@@ -342,34 +342,29 @@
 
 const INCLUDE_GUARD_PREFIX: &'static str = "CXXBRIDGE03_TYPE_";
 
-fn write_include_guard_start(out: &mut OutFile, namespace: &Namespace, ident: &Ident) {
+fn write_include_guard_start(out: &mut OutFile, ident: &Ident) {
     writeln!(
         out,
         "#ifndef {}{}{}",
-        INCLUDE_GUARD_PREFIX, namespace, ident
+        INCLUDE_GUARD_PREFIX, out.namespace, ident
     );
     writeln!(
         out,
         "#define {}{}{}",
-        INCLUDE_GUARD_PREFIX, namespace, ident
+        INCLUDE_GUARD_PREFIX, out.namespace, ident
     );
 }
 
-fn write_include_guard_end(out: &mut OutFile, namespace: &Namespace, ident: &Ident) {
+fn write_include_guard_end(out: &mut OutFile, ident: &Ident) {
     writeln!(
         out,
         "#endif // {}{}{}",
-        INCLUDE_GUARD_PREFIX, namespace, ident
+        INCLUDE_GUARD_PREFIX, out.namespace, ident
     );
 }
 
-fn write_struct_with_methods(
-    out: &mut OutFile,
-    ety: &ExternType,
-    methods: &[&ExternFn],
-    namespace: &Namespace,
-) {
-    write_include_guard_start(out, namespace, &ety.ident);
+fn write_struct_with_methods(out: &mut OutFile, ety: &ExternType, methods: &[&ExternFn]) {
+    write_include_guard_start(out, &ety.ident);
     for line in ety.doc.to_string().lines() {
         writeln!(out, "//{}", line);
     }
@@ -384,11 +379,11 @@
         writeln!(out, ";");
     }
     writeln!(out, "}};");
-    write_include_guard_end(out, namespace, &ety.ident);
+    write_include_guard_end(out, &ety.ident);
 }
 
-fn write_enum(out: &mut OutFile, enm: &Enum, namespace: &Namespace) {
-    write_include_guard_start(out, namespace, &enm.ident);
+fn write_enum(out: &mut OutFile, enm: &Enum) {
+    write_include_guard_start(out, &enm.ident);
     for line in enm.doc.to_string().lines() {
         writeln!(out, "//{}", line);
     }
@@ -399,7 +394,7 @@
         writeln!(out, "  {} = {},", variant.ident, variant.discriminant);
     }
     writeln!(out, "}};");
-    write_include_guard_end(out, namespace, &enm.ident);
+    write_include_guard_end(out, &enm.ident);
 }
 
 fn check_enum(out: &mut OutFile, enm: &Enum) {
