1// Copyright (c) 2024 Jonas Schäfer <jonas@zombofant.net>
2//
3// This Source Code Form is subject to the terms of the Mozilla Public
4// License, v. 2.0. If a copy of the MPL was not distributed with this
5// file, You can obtain one at http://mozilla.org/MPL/2.0/.
6
7//! Module with specific [`syn::Type`] constructors.
8
9use proc_macro2::Span;
10use syn::{spanned::Spanned, *};
11
12/// Construct a [`syn::Type`] referring to `::xso::exports::rxml::QName`.
13pub(crate) fn qname_ty(span: Span) -> Type {
14 Type::Path(TypePath {
15 qself: None,
16 path: Path {
17 leading_colon: Some(syn::token::PathSep {
18 spans: [span, span],
19 }),
20 segments: [
21 PathSegment {
22 ident: Ident::new("xso", span),
23 arguments: PathArguments::None,
24 },
25 PathSegment {
26 ident: Ident::new("exports", span),
27 arguments: PathArguments::None,
28 },
29 PathSegment {
30 ident: Ident::new("rxml", span),
31 arguments: PathArguments::None,
32 },
33 PathSegment {
34 ident: Ident::new("QName", span),
35 arguments: PathArguments::None,
36 },
37 ]
38 .into_iter()
39 .collect(),
40 },
41 })
42}
43
44/// Construct a [`syn::Expr`] referring to
45/// `<#ty as ::xso::FromXmlText>::from_xml_text`.
46pub(crate) fn from_xml_text_fn(ty: Type) -> Expr {
47 let span = ty.span();
48 Expr::Path(ExprPath {
49 attrs: Vec::new(),
50 qself: Some(QSelf {
51 lt_token: syn::token::Lt { spans: [span] },
52 ty: Box::new(ty),
53 position: 2,
54 as_token: Some(syn::token::As { span }),
55 gt_token: syn::token::Gt { spans: [span] },
56 }),
57 path: Path {
58 leading_colon: Some(syn::token::PathSep {
59 spans: [span, span],
60 }),
61 segments: [
62 PathSegment {
63 ident: Ident::new("xso", span),
64 arguments: PathArguments::None,
65 },
66 PathSegment {
67 ident: Ident::new("FromXmlText", span),
68 arguments: PathArguments::None,
69 },
70 PathSegment {
71 ident: Ident::new("from_xml_text", span),
72 arguments: PathArguments::None,
73 },
74 ]
75 .into_iter()
76 .collect(),
77 },
78 })
79}
80
81/// Construct a [`syn::Expr`] referring to
82/// `<#ty as ::xso::IntoOptionalXmlText>::into_optional_xml_text`.
83pub(crate) fn into_optional_xml_text_fn(ty: Type) -> Expr {
84 let span = ty.span();
85 Expr::Path(ExprPath {
86 attrs: Vec::new(),
87 qself: Some(QSelf {
88 lt_token: syn::token::Lt { spans: [span] },
89 ty: Box::new(ty),
90 position: 2,
91 as_token: Some(syn::token::As { span }),
92 gt_token: syn::token::Gt { spans: [span] },
93 }),
94 path: Path {
95 leading_colon: Some(syn::token::PathSep {
96 spans: [span, span],
97 }),
98 segments: [
99 PathSegment {
100 ident: Ident::new("xso", span),
101 arguments: PathArguments::None,
102 },
103 PathSegment {
104 ident: Ident::new("IntoOptionalXmlText", span),
105 arguments: PathArguments::None,
106 },
107 PathSegment {
108 ident: Ident::new("into_optional_xml_text", span),
109 arguments: PathArguments::None,
110 },
111 ]
112 .into_iter()
113 .collect(),
114 },
115 })
116}
117
118/// Construct a [`syn::Expr`] referring to
119/// `<#of_ty as ::std::default::Default>::default`.
120pub(crate) fn default_fn(of_ty: Type) -> Expr {
121 let span = of_ty.span();
122 Expr::Path(ExprPath {
123 attrs: Vec::new(),
124 qself: Some(QSelf {
125 lt_token: syn::token::Lt { spans: [span] },
126 ty: Box::new(of_ty),
127 position: 3,
128 as_token: Some(syn::token::As { span }),
129 gt_token: syn::token::Gt { spans: [span] },
130 }),
131 path: Path {
132 leading_colon: Some(syn::token::PathSep {
133 spans: [span, span],
134 }),
135 segments: [
136 PathSegment {
137 ident: Ident::new("std", span),
138 arguments: PathArguments::None,
139 },
140 PathSegment {
141 ident: Ident::new("default", span),
142 arguments: PathArguments::None,
143 },
144 PathSegment {
145 ident: Ident::new("Default", span),
146 arguments: PathArguments::None,
147 },
148 PathSegment {
149 ident: Ident::new("default", span),
150 arguments: PathArguments::None,
151 },
152 ]
153 .into_iter()
154 .collect(),
155 },
156 })
157}