Skip to main content

rustidy_ast/item/
extern_block.rs

1//! Extern block
2
3// Imports
4use {
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/// `ExternBlock`
18#[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/// `ExternalItem`
40#[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	// Note: Nightly-only
56	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}