uv_resolver/resolver/
reporter.rs

1use std::sync::Arc;
2
3use uv_distribution_types::{BuildableSource, VersionOrUrlRef};
4use uv_normalize::PackageName;
5use uv_redacted::DisplaySafeUrl;
6
7pub type BuildId = usize;
8
9pub trait Reporter: Send + Sync {
10    /// Callback to invoke when a dependency is resolved.
11    fn on_progress(&self, name: &PackageName, version: &VersionOrUrlRef);
12
13    /// Callback to invoke when the resolution is complete.
14    fn on_complete(&self);
15
16    /// Callback to invoke when a source distribution build is kicked off.
17    fn on_build_start(&self, source: &BuildableSource) -> usize;
18
19    /// Callback to invoke when a source distribution build is complete.
20    fn on_build_complete(&self, source: &BuildableSource, id: usize);
21
22    /// Callback to invoke when a download is kicked off.
23    fn on_download_start(&self, name: &PackageName, size: Option<u64>) -> usize;
24
25    /// Callback to invoke when a download makes progress (i.e. some number of bytes are
26    /// downloaded).
27    fn on_download_progress(&self, id: usize, bytes: u64);
28
29    /// Callback to invoke when a download is complete.
30    fn on_download_complete(&self, name: &PackageName, id: usize);
31
32    /// Callback to invoke when a repository checkout begins.
33    fn on_checkout_start(&self, url: &DisplaySafeUrl, rev: &str) -> usize;
34
35    /// Callback to invoke when a repository checkout completes.
36    fn on_checkout_complete(&self, url: &DisplaySafeUrl, rev: &str, id: usize);
37}
38
39impl dyn Reporter {
40    /// Converts this reporter to a [`uv_distribution::Reporter`].
41    pub(crate) fn into_distribution_reporter(
42        self: Arc<dyn Reporter>,
43    ) -> Arc<dyn uv_distribution::Reporter> {
44        Arc::new(Facade {
45            reporter: self.clone(),
46        })
47    }
48}
49
50/// A facade for converting from [`Reporter`] to [`uv_distribution::Reporter`].
51struct Facade {
52    reporter: Arc<dyn Reporter>,
53}
54
55impl uv_distribution::Reporter for Facade {
56    fn on_build_start(&self, source: &BuildableSource) -> usize {
57        self.reporter.on_build_start(source)
58    }
59
60    fn on_build_complete(&self, source: &BuildableSource, id: usize) {
61        self.reporter.on_build_complete(source, id);
62    }
63
64    fn on_checkout_start(&self, url: &DisplaySafeUrl, rev: &str) -> usize {
65        self.reporter.on_checkout_start(url, rev)
66    }
67
68    fn on_checkout_complete(&self, url: &DisplaySafeUrl, rev: &str, id: usize) {
69        self.reporter.on_checkout_complete(url, rev, id);
70    }
71
72    fn on_download_start(&self, name: &PackageName, size: Option<u64>) -> usize {
73        self.reporter.on_download_start(name, size)
74    }
75
76    fn on_download_progress(&self, id: usize, bytes: u64) {
77        self.reporter.on_download_progress(id, bytes);
78    }
79
80    fn on_download_complete(&self, name: &PackageName, id: usize) {
81        self.reporter.on_download_complete(name, id);
82    }
83}