accepts-codegen 0.0.1

Rust toolkit for composing synchronous and asynchronous acceptor pipelines
Documentation
use syn::{
    AngleBracketedGenericArguments, GenericArgument, Ident, Path, PathArguments, PathSegment,
    Token, Type, TypeTuple, punctuated::Punctuated, token::PathSep,
};

use crate::common::syn::ext::{
    AngleBracketedGenericArgumentsConstructExt, IdentConstructExt, PathSegmentConstructExt,
    PunctuatedConstructExt, TypeTupleConstructExt,
};

use super::core_path;

pub fn phantom_data_path(args: Punctuated<Type, Token![,]>) -> Path {
    let mut path = core_path();
    let segments = &mut path.segments;

    segments.push(PathSegment::from_ident(Ident::from_str("marker")));
    segments.push(PathSegment::from_parts(
        Ident::from_str("PhantomData"),
        if args.is_empty() {
            PathArguments::None
        } else {
            PathArguments::AngleBracketed(AngleBracketedGenericArguments::from_colon2_args(
                Some(PathSep::default()),
                Punctuated::from_value(GenericArgument::Type({
                    if args.len() == 1 {
                        args.into_iter().next().unwrap()
                    } else {
                        Type::Tuple(TypeTuple::from_elems(args))
                    }
                })),
            ))
        },
    ));

    path
}