1use std::fmt;
2
3use serde::{Deserialize, Deserializer, Serialize, Serializer};
4
5mod backup;
6mod client;
7pub mod registration;
8mod restore;
9
10pub use backup::{
11 BackupCredentials, BackupCredentialsRequest, BackupReport, BackupTarget, CapabilitiesRequest,
12 ContainerCreds, Outcome, Purpose, TargetOutcome,
13};
14pub use client::{
15 CERT_RENEW_AFTER, CanopyClient, ClientBuilderFactory, DEFAULT_CANOPY_URL, NewEvent, Severity,
16 TAILSCALE_URL, client_builder, device_identity, tailscale_client, user_agent,
17};
18pub use reqwest;
19pub use restore::{
20 RestoreCapabilitiesRequest, RestoreCredentials, RestoreCredentialsRequest, RestoreVerification,
21 WorklistEntry,
22};
23
24#[derive(Clone)]
26pub struct Redacted<T>(pub T);
27
28impl<T> fmt::Debug for Redacted<T> {
29 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
30 f.write_str("<redacted>")
31 }
32}
33
34impl<T> std::ops::Deref for Redacted<T> {
35 type Target = T;
36 fn deref(&self) -> &T {
37 &self.0
38 }
39}
40
41impl<T: Serialize> Serialize for Redacted<T> {
42 fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
43 self.0.serialize(serializer)
44 }
45}
46
47impl<'de, T: Deserialize<'de>> Deserialize<'de> for Redacted<T> {
48 fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
49 T::deserialize(deserializer).map(Redacted)
50 }
51}