skipif 0.1.0

Turn test cases into no-ops with _SKIPPED appended to their name based on compile time conditions.
Documentation
// Copyright 2024 Steve Wayne Warren
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

use proc_macro2::{Span, TokenStream};
use quote::quote;
use syn::{Ident, ItemFn, ReturnType};

use super::analyze::SkipIf;

impl SkipIf {
    pub(crate) fn codegen(&self, item: ItemFn) -> TokenStream {
        let ItemFn {
            attrs,
            vis,
            mut sig,
            block,
        } = item;

        let mut skip = false;
        for element in &self.required_elements {
            if element.is_missing() {
                skip = true;
                break;
            }
        }

        let expanded = if skip {
            let ident_string = format!("{}_SKIPPED", sig.ident);
            sig.ident = Ident::new(ident_string.as_str(), Span::mixed_site());
            sig.output = ReturnType::Default;
            quote! {
                #(#attrs)*
                #vis #sig {}
            }
        } else {
            quote! {
                #(#attrs)*
                #vis #sig {
                    #block
                }
            }
        };

        expanded
    }
}