Skip to content

Commit

Permalink
#98 Refactor in a new module
Browse files Browse the repository at this point in the history
  • Loading branch information
la10736 committed May 1, 2021
1 parent 65d4487 commit 81fd9ae
Show file tree
Hide file tree
Showing 4 changed files with 40 additions and 41 deletions.
5 changes: 1 addition & 4 deletions src/lib.rs
Expand Up @@ -246,10 +246,7 @@ mod utils;

use syn::{parse_macro_input, ItemFn};

use crate::parse::{
fixture::{FixtureInfo, ReplaceFutureAttribute},
rstest::RsTestInfo,
};
use crate::parse::{fixture::FixtureInfo, future::ReplaceFutureAttribute, rstest::RsTestInfo};
use parse::ExtendWithFunctionAttrs;
use quote::ToTokens;

Expand Down
37 changes: 0 additions & 37 deletions src/parse/fixture.rs
@@ -1,5 +1,3 @@
use std::mem;

/// `fixture`'s related data and parsing
use syn::{
parse::{Parse, ParseStream},
Expand Down Expand Up @@ -101,41 +99,6 @@ impl VisitMut for FixturesFunctionExtractor {
}
}

#[derive(Default)]
pub(crate) struct ReplaceFutureAttribute(Vec<syn::Error>);

impl ReplaceFutureAttribute {
pub(crate) fn replace(item_fn: &mut ItemFn) -> Result<(), ErrorsVec> {
let mut visitor = Self::default();
visitor.visit_item_fn_mut(item_fn);
if visitor.0.is_empty() {
Ok(())
} else {
Err(visitor.0.into())
}
}
}

impl VisitMut for ReplaceFutureAttribute {
fn visit_fn_arg_mut(&mut self, node: &mut FnArg) {
match node {
FnArg::Typed(t) => {
let attrs = mem::take(&mut t.attrs);
let (futures, attrs): (Vec<_>, Vec<_>) =
attrs.into_iter().partition(|a| attr_is(a, "future"));
if futures.len() > 0 {
let ty = &t.ty;
t.ty = parse_quote! {
impl std::future::Future<Output = #ty>
}
}
t.attrs = attrs;
}
FnArg::Receiver(_) => {}
}
}
}

/// Simple struct used to visit function attributes and extract fixture default values info and
/// eventualy parsing errors
#[derive(Default)]
Expand Down
38 changes: 38 additions & 0 deletions src/parse/future.rs
@@ -0,0 +1,38 @@
use syn::{parse_quote, visit_mut::VisitMut, FnArg, ItemFn};

use crate::{error::ErrorsVec, utils::attr_is};

#[derive(Default)]
pub(crate) struct ReplaceFutureAttribute(Vec<syn::Error>);

impl ReplaceFutureAttribute {
pub(crate) fn replace(item_fn: &mut ItemFn) -> Result<(), ErrorsVec> {
let mut visitor = Self::default();
visitor.visit_item_fn_mut(item_fn);
if visitor.0.is_empty() {
Ok(())
} else {
Err(visitor.0.into())
}
}
}

impl VisitMut for ReplaceFutureAttribute {
fn visit_fn_arg_mut(&mut self, node: &mut FnArg) {
match node {
FnArg::Typed(t) => {
let attrs = std::mem::take(&mut t.attrs);
let (futures, attrs): (Vec<_>, Vec<_>) =
attrs.into_iter().partition(|a| attr_is(a, "future"));
if futures.len() > 0 {
let ty = &t.ty;
t.ty = parse_quote! {
impl std::future::Future<Output = #ty>
}
}
t.attrs = attrs;
}
FnArg::Receiver(_) => {}
}
}
}
1 change: 1 addition & 0 deletions src/parse/mod.rs
Expand Up @@ -30,6 +30,7 @@ pub(crate) mod fixture;
pub(crate) mod rstest;
pub(crate) mod testcase;
pub(crate) mod vlist;
pub(crate) mod future;

pub(crate) trait ExtendWithFunctionAttrs {
fn extend_with_function_attrs(
Expand Down

0 comments on commit 81fd9ae

Please sign in to comment.