1use {
5 crate::{
6 attr::{self, BracedWithInnerAttributes, WithOuterAttributes},
7 token,
8 vis::Visibility,
9 },
10 super::{Function, MacroInvocationSemi, StaticItem, TypeAlias, function::Abi},
11 rustidy_format::{Format, Formattable, WhitespaceFormat},
12 rustidy_parse::Parse,
13 rustidy_print::Print,
14 rustidy_util::Whitespace,
15};
16
17#[derive(PartialEq, Eq, Clone, Debug)]
19#[derive(serde::Serialize, serde::Deserialize)]
20#[derive(Parse, Formattable, Format, Print)]
21pub struct ExternBlock {
22 pub unsafe_: Option<token::Unsafe>,
23 #[format(prefix_ws(expr = Whitespace::SINGLE, if_ = self.unsafe_.is_some()))]
24 pub extern_: token::Extern,
25 #[format(prefix_ws = Whitespace::SINGLE)]
26 pub abi: Option<Abi>,
27 #[format(prefix_ws = Whitespace::SINGLE)]
28 pub inner: BracedWithInnerAttributes<ExternBlockItems>,
29}
30
31#[derive(PartialEq, Eq, Clone, Debug)]
32#[derive(serde::Serialize, serde::Deserialize)]
33#[derive(Parse, Formattable, Format, Print)]
34pub struct ExternBlockItems(
35 #[format(args = rustidy_format::vec::args_prefix_ws(Whitespace::INDENT))]
36 Vec<ExternalItem>,
37);
38
39#[derive(PartialEq, Eq, Clone, Debug)]
41#[derive(serde::Serialize, serde::Deserialize)]
42#[derive(Parse, Formattable, Format, Print)]
43pub struct ExternalItem(
44 #[format(args = attr::with::fmt(Whitespace::INDENT))]
45 pub WithOuterAttributes<ExternalItemInner>,
46);
47
48#[derive(PartialEq, Eq, Clone, Debug)]
49#[derive(serde::Serialize, serde::Deserialize)]
50#[derive(Parse, Formattable, Format, Print)]
51pub enum ExternalItemInner {
52 Macro(MacroInvocationSemi),
53 Static(ExternalItemStatic),
54 Function(ExternalItemFunction),
55 TypeAlias(ExternalItemTypeAlias),
57}
58
59#[derive(PartialEq, Eq, Clone, Debug)]
60#[derive(serde::Serialize, serde::Deserialize)]
61#[derive(Parse, Formattable, Format, Print)]
62pub struct ExternalItemStatic {
63 pub vis: Option<Visibility>,
64 #[format(prefix_ws(expr = Whitespace::SINGLE, if_ = self.vis.is_some()))]
65 pub static_: StaticItem,
66}
67
68#[derive(PartialEq, Eq, Clone, Debug)]
69#[derive(serde::Serialize, serde::Deserialize)]
70#[derive(Parse, Formattable, Format, Print)]
71pub struct ExternalItemFunction {
72 pub vis: Option<Visibility>,
73 #[format(prefix_ws(expr = Whitespace::SINGLE, if_ = self.vis.is_some()))]
74 pub function: Function,
75}
76
77#[derive(PartialEq, Eq, Clone, Debug)]
78#[derive(serde::Serialize, serde::Deserialize)]
79#[derive(Parse, Formattable, Format, Print)]
80pub struct ExternalItemTypeAlias {
81 pub vis: Option<Visibility>,
82 #[format(prefix_ws(expr = Whitespace::SINGLE, if_ = self.vis.is_some()))]
83 pub alias: TypeAlias,
84}