better_fetch/plugins/
logger.rs1use async_trait::async_trait;
2use tracing::{error, info, warn};
3
4use crate::hooks::{ErrorContext, Hooks};
5use crate::plugin::Plugin;
6
7#[derive(Debug, Clone)]
9pub struct LoggerPlugin {
10 pub enabled: bool,
11 pub verbose: bool,
12}
13
14impl LoggerPlugin {
15 pub fn new() -> Self {
16 Self {
17 enabled: true,
18 verbose: false,
19 }
20 }
21
22 pub fn enabled(mut self, enabled: bool) -> Self {
23 self.enabled = enabled;
24 self
25 }
26
27 pub fn verbose(mut self, verbose: bool) -> Self {
28 self.verbose = verbose;
29 self
30 }
31}
32
33impl Default for LoggerPlugin {
34 fn default() -> Self {
35 Self::new()
36 }
37}
38
39#[async_trait]
40impl Plugin for LoggerPlugin {
41 fn id(&self) -> &'static str {
42 "logger"
43 }
44
45 fn hooks(&self) -> Hooks {
46 let enabled = self.enabled;
47 let verbose = self.verbose;
48
49 Hooks::new()
50 .on_request(move |ctx| {
51 let enabled = enabled;
52 let verbose = verbose;
53 async move {
54 if enabled {
55 if verbose {
56 info!(
57 method = %ctx.method,
58 url = %ctx.url,
59 "better-fetch request"
60 );
61 } else {
62 info!(url = %ctx.url, "better-fetch request");
63 }
64 }
65 Ok(ctx)
66 }
67 })
68 .on_response({
69 let enabled = self.enabled;
70 let verbose = self.verbose;
71 move |ctx| {
72 let enabled = enabled;
73 let verbose = verbose;
74 async move {
75 if enabled {
76 let status = ctx.response.status();
77 if verbose {
78 info!(
79 status = %status,
80 url = %ctx.request.url,
81 "better-fetch response"
82 );
83 } else {
84 info!(status = %status, "better-fetch response");
85 }
86 }
87 Ok(ctx.response)
88 }
89 }
90 })
91 .on_retry({
92 let enabled = self.enabled;
93 move |ctx| {
94 let enabled = enabled;
95 async move {
96 if enabled {
97 warn!(
98 retry_attempt = ctx.request.retry_attempt,
99 next_attempt = ctx.request.retry_attempt + 1,
100 status = %ctx.response.status(),
101 url = %ctx.request.url,
102 "better-fetch retry"
103 );
104 }
105 }
106 }
107 })
108 .on_error({
109 let enabled = self.enabled;
110 move |ctx: ErrorContext| {
111 let enabled = enabled;
112 async move {
113 if enabled {
114 error!(
115 error = %ctx.error,
116 url = %ctx.request.url,
117 "better-fetch error"
118 );
119 }
120 }
121 }
122 })
123 }
124}