types.rs

  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}