Skip to content

Commit

Permalink
Merge pull request #8 from ltouati/master
Browse files Browse the repository at this point in the history
Update versions used by the crate
  • Loading branch information
dmitryb-dev authored Feb 13, 2024
2 parents c64a6eb + 0d0412b commit 9ae9744
Show file tree
Hide file tree
Showing 15 changed files with 644 additions and 292 deletions.
514 changes: 419 additions & 95 deletions Cargo.lock

Large diffs are not rendered by default.

10 changes: 5 additions & 5 deletions Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "waiter_di"
version = "1.6.5"
version = "1.6.6"
edition = "2018"
description = "Dependency injection"
keywords = [ "dependency-injection", "inversion-of-control", "di", "ioc"]
Expand All @@ -14,11 +14,11 @@ members = [ "crates/*" ]

[dependencies]
waiter_codegen = { path = "crates/waiter_codegen", version = "1.6.5" }
config = "0.9"
serde = { version = "1.0.115", features = [ "derive" ] }
regex = "1.3.9"
config = "0.14.0"
serde = { version = "1.0.196", features = [ "derive" ] }
regex = "1.10.3"
lazy_static = "1.4.0"
log = "0.4.11"
log = "0.4.20"

[features]
async = [ "waiter_codegen/async" ]
4 changes: 2 additions & 2 deletions crates/waiter_codegen/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ description = "Macro for Waiter DI"
repository = "https://github.com/dmitryb-dev/waiter"
license = "MIT"
readme = "../../README.md"
authors = [ "[email protected]" ]
authors = ["[email protected]"]

[dependencies]
quote = "1.0.7"
Expand All @@ -15,7 +15,7 @@ proc-macro2 = "1.0.24"

[dependencies.syn]
version = "1.0.48"
features = [ "full" ]
features = ["full"]

[lib]
proc-macro = true
Expand Down
26 changes: 13 additions & 13 deletions crates/waiter_codegen/src/attr_parser.rs
Original file line number Diff line number Diff line change
@@ -1,23 +1,23 @@
use syn::{Path, Error, Attribute};
use syn::punctuated::Punctuated;
use syn::parse::Parser;
use syn::token::{Comma};
use syn::{LitStr, ExprAssign};
use syn::parse_macro_input::parse;
use proc_macro::TokenStream;
use proc_macro2::{TokenStream as TokenStream2};

use proc_macro2::TokenStream as TokenStream2;
use quote::ToTokens;
use syn::{Attribute, Error, Path};
use syn::{ExprAssign, LitStr};
use syn::parse::Parser;
use syn::parse_macro_input::parse;
use syn::punctuated::Punctuated;
use syn::token::Comma;

pub(crate) struct ProvidesAttr {
pub profiles: Vec<Path>
pub profiles: Vec<Path>,
}

pub(crate) fn parse_provides_attr(attr: TokenStream) -> Result<ProvidesAttr, Error> {
let profiles_syn = <Punctuated<Path, Comma>>::parse_terminated.parse(attr)?;

let profiles: Vec<Path> = profiles_syn
.iter()
.map(|p| p.clone())
.iter().cloned()
.collect();

Ok(ProvidesAttr { profiles })
Expand All @@ -27,7 +27,7 @@ pub(crate) fn parse_provides_attr(attr: TokenStream) -> Result<ProvidesAttr, Err
#[derive(Clone)]
pub(crate) struct PropAttr {
pub(crate) name: Option<String>,
pub(crate) default_value: Option<TokenStream2>
pub(crate) default_value: Option<TokenStream2>,
}

pub(crate) fn parse_prop_attr(attr: &Attribute) -> Result<PropAttr, Error> {
Expand All @@ -40,13 +40,13 @@ pub(crate) fn parse_prop_attr(attr: &Attribute) -> Result<PropAttr, Error> {

Ok(PropAttr {
name: Some(name.value()),
default_value: Some(with_default.right.to_token_stream())
default_value: Some(with_default.right.to_token_stream()),
})
})
.or_else(|_| {
Ok(PropAttr {
name: Some(attr.parse_args::<LitStr>()?.value()),
default_value: None
default_value: None,
})
})
}
Expand Down
51 changes: 30 additions & 21 deletions crates/waiter_codegen/src/component/injector.rs
Original file line number Diff line number Diff line change
@@ -1,23 +1,25 @@
use proc_macro2::{TokenStream as TokenStream2};
use proc_macro2::TokenStream as TokenStream2;
use quote::ToTokens;
use syn::{Ident, Error, PathArguments};
use syn::{Error, Ident, PathArguments};
use syn::spanned::Spanned;

use crate::component::type_to_inject::TypeToInject;

pub(crate) trait Injector {
fn generate_inject_code(
&self,
to_inject: &TypeToInject,
container: &Ident
container: &Ident,
) -> Option<TokenStream2>;
}

pub(crate) struct WrcInjector;

impl Injector for WrcInjector {
fn generate_inject_code(
&self,
to_inject: &TypeToInject,
container: &Ident
container: &Ident,
) -> Option<TokenStream2> {
#[cfg(feature = "async")]
const RC_FULL_TYPE: &str = "std :: sync :: Arc <";
Expand Down Expand Up @@ -47,17 +49,18 @@ impl Injector for WrcInjector {


pub(crate) struct BoxInjector;

impl Injector for BoxInjector {
fn generate_inject_code(
&self,
to_inject: &TypeToInject,
container: &Ident
container: &Ident,
) -> Option<TokenStream2> {
if to_inject.type_name.starts_with("Box <") {
let referenced_type = get_type_arg(&to_inject.type_path.segments[0].arguments);
return Some(quote::quote! {
Box::new(waiter_di::Provider::<#referenced_type>::create(#container))
})
});
}

None
Expand All @@ -66,11 +69,12 @@ impl Injector for BoxInjector {


pub(crate) struct DeferredInjector;

impl Injector for DeferredInjector {
fn generate_inject_code(
&self,
to_inject: &TypeToInject,
_container: &Ident
_container: &Ident,
) -> Option<TokenStream2> {
let referenced_type_opt = if to_inject.type_name.starts_with("waiter_di :: Deferred <") {
Some(get_type_arg(&to_inject.type_path.segments[1].arguments))
Expand All @@ -88,15 +92,16 @@ impl Injector for DeferredInjector {


pub(crate) struct ConfigInjector;

impl Injector for ConfigInjector {
fn generate_inject_code(
&self,
to_inject: &TypeToInject,
container: &Ident
container: &Ident,
) -> Option<TokenStream2> {
if to_inject.type_name == "Config".to_string()
|| to_inject.type_name == "config :: Config".to_string() {
return Some(quote::quote! { #container.config.clone() })
if to_inject.type_name == *"Config"
|| to_inject.type_name == *"config :: Config" {
return Some(quote::quote! { #container.config.clone() });
}

None
Expand All @@ -105,11 +110,12 @@ impl Injector for ConfigInjector {


pub(crate) struct PropInjector;

impl Injector for PropInjector {
fn generate_inject_code(
&self,
to_inject: &TypeToInject,
container: &Ident
container: &Ident,
) -> Option<TokenStream2> {
let (prop_name_opt, default_value_code) = if to_inject.prop_attr.is_some() {
let prop_attr = to_inject.prop_attr.clone().unwrap();
Expand All @@ -120,7 +126,7 @@ impl Injector for PropInjector {

let default_value_code = prop_attr.default_value.clone()
.map(|default_value| quote::quote! { .or_else(|| Some(#default_value)) })
.unwrap_or(quote::quote! {});
.unwrap_or_default();

(prop_name_opt, default_value_code)
} else {
Expand Down Expand Up @@ -157,7 +163,7 @@ impl Injector for PropInjector {
type_path.clone(),
type_name.clone(),
prop_name.to_string(),
quote::quote! { value }
quote::quote! { value },
);

quote::quote! {
Expand All @@ -177,7 +183,7 @@ impl Injector for PropInjector {
let type_name = to_inject.type_name.clone();
let type_path = to_inject.type_path.clone();
Some(quote::quote! {
#container.config.clone().try_into::<#type_path>()
#container.config.clone().try_deserialize::<#type_path>()
.expect(format!("Can't parse config as '{}'", #type_name).as_str())
})
} else {
Expand All @@ -188,19 +194,20 @@ impl Injector for PropInjector {
}

trait PropExtractor {
fn generate_extract_method(&self, type_name: String, ) -> Option<TokenStream2>;
fn generate_extract_method(&self, type_name: String) -> Option<TokenStream2>;
fn generate_convert_code(
&self,
_type_path: TokenStream2,
_type_name: String,
_prop_name: String,
extract_code: TokenStream2
extract_code: TokenStream2,
) -> TokenStream2 {
extract_code
}
}

struct SafeCastPropExtractor;

impl PropExtractor for SafeCastPropExtractor {
fn generate_extract_method(&self, type_name: String) -> Option<TokenStream2> {
match type_name.as_str() {
Expand All @@ -214,13 +221,14 @@ impl PropExtractor for SafeCastPropExtractor {
type_path: TokenStream2,
_type_name: String,
_prop_name: String,
value: TokenStream2
value: TokenStream2,
) -> TokenStream2 {
quote::quote! { #type_path::from(#value) }
}
}

struct UnsafeCastPropExtractor;

impl PropExtractor for UnsafeCastPropExtractor {
fn generate_extract_method(&self, type_name: String) -> Option<TokenStream2> {
match type_name.as_str() {
Expand All @@ -235,7 +243,7 @@ impl PropExtractor for UnsafeCastPropExtractor {
type_path: TokenStream2,
type_name: String,
prop_name: String,
value: TokenStream2
value: TokenStream2,
) -> TokenStream2 {
quote::quote! {
<#type_path as std::convert::TryFrom<i64>>::try_from(#value)
Expand All @@ -245,12 +253,13 @@ impl PropExtractor for UnsafeCastPropExtractor {
}

struct AsCastPropExtractor;

impl PropExtractor for AsCastPropExtractor {
fn generate_extract_method(&self, type_name: String) -> Option<TokenStream2> {
match type_name.as_str() {
"i64" => Some(quote::quote! { get_int }),
"f64" | "f32" => Some(quote::quote! { get_float }),
"String" => Some(quote::quote! { get_str }),
"String" => Some(quote::quote! { get_string }),
"bool" => Some(quote::quote! { get_bool }),
_ => None
}
Expand All @@ -261,7 +270,7 @@ impl PropExtractor for AsCastPropExtractor {
type_path: TokenStream2,
_type_name: String,
_prop_name: String,
value: TokenStream2
value: TokenStream2,
) -> TokenStream2 {
quote::quote! {
#value as #type_path
Expand Down
Loading

0 comments on commit 9ae9744

Please sign in to comment.