# `fnaop` `fnaop` is a lightweight and flexible Rust library designed to bring Aspect-Oriented Programming (`AOP`) to your Rust functions. By using `fnaop`, you can easily add `pre` and `post` function logic without modifying the core functionality of your functions, enabling cleaner and more maintainable code. [APIs Documents](https://docs.rs/fnaop) [changelog](./CHANGELOG.md) ## 1.`Usage` Add this to your `Cargo.toml`: ```toml [dependencies] fnaop = "0.1" ``` ## 2.`APIs` `Aspect`: An attribute macro for applying Aspect-Oriented Programming (`AOP`) to functions. The `Aspect` macro allows you to specify `before` and `after` functions that will be called before and after the target function respectively. This is useful for encapsulating cross-cutting concerns such as logging, metrics, or other side effects. ### 2.1.`Noarmal` Ordinary function, adapted to 0 or more ordinary parameters. ```rust #[Aspect(before = "before_fn")] pub fn say_hello(x: i64) { println!("Hello:say_hello, {}", x); } #[Aspect(after = "after_fn")] pub fn say_hello(x: i64) { println!("Hello:say_hello, {}", x); } #[Aspect(before = "before_fn", after = "after_fn")] pub fn say_hello(x: i64) { println!("Hello:say_hello, {}", x); } // ---------------------------------------------------------------- #[Aspect(before = "before_fn_empty", after = "before_fn_empty")] pub fn say_hello_empty() { println!("Hello:say_hello_empty"); } ``` ### 2.2.`Lifetime` Functions with lifetime parameters. ```rust #[Aspect(before = "before::struct_before_fn_lifetime", after = "after::struct_after_fn_lifetime")] pub fn say_hello_struct_lifetime<'a>(ctx: LifetimeHelloContext<'a>) { println!("struct::Hello, {} {}", ctx.x, ctx.y); } ``` ### 2.3.`Return value` Functions with return values. ```rust #[Aspect(before = "before::struct_before_fn_lifetime", after = "after::struct_after_fn_lifetime")] pub fn say_hello_struct_lifetime_with_return<'a>(ctx: LifetimeHelloContext<'a>) -> i64 { println!("struct::Hello, {} {}", ctx.x, ctx.y); *ctx.x } ``` ### 2.4.`Others` … ```rust // @see integration_tests.rs ```