use super::{attr_names::*, util::*};

pub struct StorageGetAttribute {
    pub identifier: String,
}

impl StorageGetAttribute {
    pub fn parse(attr: &syn::Attribute) -> Option<Self> {
        is_attr_one_string_arg(attr, ATTR_STORAGE_GET).map(|arg_str| StorageGetAttribute {
            identifier: arg_str,
        })
    }
}

pub struct StorageSetAttribute {
    pub identifier: String,
}

impl StorageSetAttribute {
    pub fn parse(attr: &syn::Attribute) -> Option<Self> {
        is_attr_one_string_arg(attr, ATTR_STORAGE_SET).map(|arg_str| StorageSetAttribute {
            identifier: arg_str,
        })
    }
}

pub struct StorageMapperAttribute {
    pub identifier: String,
}

impl StorageMapperAttribute {
    pub fn parse(attr: &syn::Attribute) -> Option<Self> {
        is_attr_one_string_arg(attr, ATTR_STORAGE_MAPPER).map(|arg_str| StorageMapperAttribute {
            identifier: arg_str,
        })
    }
}

pub struct StorageMapperFromAddressAttribute {
    pub identifier: String,
}

impl StorageMapperFromAddressAttribute {
    pub fn parse(attr: &syn::Attribute) -> Option<Self> {
        is_attr_one_string_arg(attr, ATTR_STORAGE_MAPPER_FROM_ADDRESS).map(|arg_str| {
            StorageMapperFromAddressAttribute {
                identifier: arg_str,
            }
        })
    }
}

pub struct StorageIsEmptyAttribute {
    pub identifier: String,
}

impl StorageIsEmptyAttribute {
    pub fn parse(attr: &syn::Attribute) -> Option<Self> {
        is_attr_one_string_arg(attr, ATTR_STORAGE_IS_EMPTY).map(|arg_str| StorageIsEmptyAttribute {
            identifier: arg_str,
        })
    }
}

pub struct StorageClearAttribute {
    pub identifier: String,
}

impl StorageClearAttribute {
    pub fn parse(attr: &syn::Attribute) -> Option<Self> {
        is_attr_one_string_arg(attr, ATTR_STORAGE_CLEAR).map(|arg_str| StorageClearAttribute {
            identifier: arg_str,
        })
    }
}
