Skip to main content

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