133d722a9Sopenharmony_ciuse proc_macro2::Ident;
233d722a9Sopenharmony_ci
333d722a9Sopenharmony_ci#[derive(Copy, Clone, PartialEq, Debug)]
433d722a9Sopenharmony_cipub enum Block<'a> {
533d722a9Sopenharmony_ci    AnonymousNamespace,
633d722a9Sopenharmony_ci    Namespace(&'static str),
733d722a9Sopenharmony_ci    UserDefinedNamespace(&'a Ident),
833d722a9Sopenharmony_ci    InlineNamespace(&'static str),
933d722a9Sopenharmony_ci    ExternC,
1033d722a9Sopenharmony_ci}
1133d722a9Sopenharmony_ci
1233d722a9Sopenharmony_ciimpl<'a> Block<'a> {
1333d722a9Sopenharmony_ci    pub fn write_begin(self, out: &mut String) {
1433d722a9Sopenharmony_ci        if let Block::InlineNamespace(_) = self {
1533d722a9Sopenharmony_ci            out.push_str("inline ");
1633d722a9Sopenharmony_ci        }
1733d722a9Sopenharmony_ci        self.write_common(out);
1833d722a9Sopenharmony_ci        out.push_str(" {\n");
1933d722a9Sopenharmony_ci    }
2033d722a9Sopenharmony_ci
2133d722a9Sopenharmony_ci    pub fn write_end(self, out: &mut String) {
2233d722a9Sopenharmony_ci        out.push_str("} // ");
2333d722a9Sopenharmony_ci        self.write_common(out);
2433d722a9Sopenharmony_ci        out.push('\n');
2533d722a9Sopenharmony_ci    }
2633d722a9Sopenharmony_ci
2733d722a9Sopenharmony_ci    fn write_common(self, out: &mut String) {
2833d722a9Sopenharmony_ci        match self {
2933d722a9Sopenharmony_ci            Block::AnonymousNamespace => out.push_str("namespace"),
3033d722a9Sopenharmony_ci            Block::Namespace(name) => {
3133d722a9Sopenharmony_ci                out.push_str("namespace ");
3233d722a9Sopenharmony_ci                out.push_str(name);
3333d722a9Sopenharmony_ci            }
3433d722a9Sopenharmony_ci            Block::UserDefinedNamespace(name) => {
3533d722a9Sopenharmony_ci                out.push_str("namespace ");
3633d722a9Sopenharmony_ci                out.push_str(&name.to_string());
3733d722a9Sopenharmony_ci            }
3833d722a9Sopenharmony_ci            Block::InlineNamespace(name) => {
3933d722a9Sopenharmony_ci                out.push_str("namespace ");
4033d722a9Sopenharmony_ci                out.push_str(name);
4133d722a9Sopenharmony_ci            }
4233d722a9Sopenharmony_ci            Block::ExternC => out.push_str("extern \"C\""),
4333d722a9Sopenharmony_ci        }
4433d722a9Sopenharmony_ci    }
4533d722a9Sopenharmony_ci}
46