Warning and error logging refactoring and cleanup.

This commit is contained in:
Ximon Eighteen
2024-11-27 09:40:52 +01:00
parent 7b2659fbf3
commit 18e4007253
53 changed files with 71255 additions and 42 deletions
+1
View File
@@ -0,0 +1 @@
. IN DNSKEY 256 3 8 AwEAAb14eIx8zaVrMaZG74PLSRa9Qqypj5L99H/I887NxKl1OOYnIuobN/gV6M/vZt3o/mST79wIqq3OwLpdlQbku7fXmkqG1k/PrsMecvX0bGlGBKt6txwXVvkBrin8yD0ERCkmK4DFXjeaYg0OoViwM55F5/MuxacN2+UgZHlMrXDUhJyluxpGGkj/6c3knIjGmkc/CGjJ6KO/h/yKg2Gd3o3026mN6rR0P2pe60Ar75G89kafHyMfK6/L/dYGSXMlvrHBhJUnl5iYbsjWuHnEWgnvKA3NLa2sz8VqAl1/J8HWtMxTkP0o85iSgBii+Akt/ENpsz4bzR3AqHS4FtNicks= ;{id = 2608 (zsk), size = 2048b}
+10
View File
@@ -0,0 +1,10 @@
Private-key-format: v1.2
Algorithm: 8 (RSASHA256)
Modulus: vXh4jHzNpWsxpkbvg8tJFr1CrKmPkv30f8jzzs3EqXU45ici6hs3+BXoz+9m3ej+ZJPv3Aiqrc7Aul2VBuS7t9eaSobWT8+uwx5y9fRsaUYEq3q3HBdW+QGuKfzIPQREKSYrgMVeN5piDQ6hWLAznkXn8y7Fpw3b5SBkeUytcNSEnKW7GkYaSP/pzeSciMaaRz8IaMnoo7+H/IqDYZ3ejfTbqY3qtHQ/al7rQCvvkbz2Rp8fIx8rr8v91gZJcyW+scGElSeXmJhuyNa4ecRaCe8oDc0trazPxWoCXX8nwda0zFOQ/SjzmJKAGKL4CS38Q2mzPhvNHcCodLgW02JySw==
PublicExponent: AQAB
PrivateExponent: E23lqr5nljV6V2tBx3mSqqbIzgzrQK8TIgF44vWd26S+K3fK8EfPQvz4LU6G9W2dnLHA8Ibg/cbMY7ASBq1xBIay9z6Bfpi0+qRGNKuWbGs2MmF4ooRQMmO2OO8Hl5424SNdZayXn0sRD/a2m/IhsPLJONpMgXd9266pLvkqdf3f0h6JpKGom+uPbZFKl0yaR7q8Ao9Y2TaBAWvvjAKa+izbYfCt4c6LUxwCzONLqw1WMWlQ5Zuxd7z0EbWPYvBSC46P5IiPt8/eVHy2tUNJlHVHzVo1yUhwN2+vdIp/PjzLa7l0QPYANexdgnpj6ag8QFilG4NdriVsPb1CPVHxxQ==
Prime1: 5JaYcUzgJjyoqJOyY1/PiKBydnodUttqGUHE0XldLL+9n7dqlMDeDPPYvRTLmyKOogY7Ysp1cUJYCcpTQiv3w/OT/GO4Ajz4LFbfl/9uVNr+CoPD2Pjs7w1JLwkUnRz7rW3+XCj3j3/surOhZCen6IP/i9caxPjl09ROxziIATc=
Prime2: 1DEBqP0itgfgqO3U5A7iLBgV2chNL6ePkoBNef1ZoGL5EK48aEZE4kXKimUe52ttvl4VECvrh6wKsTm1xHbJh8jgs5iEAqs8YDhKsbTAOlT7gTPyeFxd2NbCHOWH8Ca67g4sEUD5ouAdkwEX9gsTsGstYRZYKStr/GhvQRHT8Y0=
Exponent1: H2il56OFhRt+nTM2Jrtqe754G9lpoBHwASptTc8cQ2LRPlnodioOGL+Ev25VD6ru6Eps7IUfIAHasPWw/P2nnLAiXGKjTQNtokIJlQwO7+/rSiySw4Rooew0axcXUwNBfbIIakdixL/yGjFGcsmUI7nHakKTNg9xHOsmK++TmH8=
Exponent2: OJX9EFi5GfwN0F7kSBEkBYhCw3okA1JW+kWW47JJZXkfXHBqkZAzrHfaJIAE9sfyUzL5wP9FZz/c9hgivgrDgZ9zNNG2WpPZnPtGCA/gt22USIdW4PwY1sumplgboVJixTsoS02dhO7pVBuVjTq0/HYIevyfdBMtT/l1uc+MSr0=
Coefficient: fBppTk4d6GUm/o5sQp1hgkDxprsOUlymemD3tmx9KJVMtBgcel+cABlg6yQFjRydbzOeI946T8DQB7SMpvGhlHg2e0/od5H6tse2rTsn08LfCpL3DqohnOjM4AdOm8p9aQ45z64JLjvydkXM46q4kWAuGJCX3+c0PEzLvuHHeMk=
+1
View File
@@ -0,0 +1 @@
. IN DS 18172 8 2 17ffa0fdbaf763427a24524c4391e5b0e6862e66f3d27abcd71f29675a57bb14
+1
View File
@@ -0,0 +1 @@
. IN DNSKEY 257 3 8 AwEAAdcVoa98ywpURLFQ1fUItHWFbzSn+rUPKIVrU+L3+LtqzDs02TefIH9bHhE0vecO8NjtJFj1jPTdldmVceyg6bojEvCu9W3nzFgSoM7r126d3zS08YFfkMs/R/sczQNSPi6Rlpz5MRJ7tDq+3ZsDkwzRtKGkZ6sPGpMSPKftdCIrUlBph27dwAm/eb0hpTWj+wE3RfWygQAWIIyIEhAnYvaLRzfkydba/1Yr3/NKPrLDmV7be/FO6/yt1bIM1dOhNd0jkLmPzuhPPNZBM8LmQCdWd35CiP93VLHsiAM73muXmtj0b1b7YDT6bTcFjtywwlGNqL+f/VQcHySK1SZXltk= ;{id = 18172 (ksk), size = 2048b}
+10
View File
@@ -0,0 +1,10 @@
Private-key-format: v1.2
Algorithm: 8 (RSASHA256)
Modulus: 1xWhr3zLClREsVDV9Qi0dYVvNKf6tQ8ohWtT4vf4u2rMOzTZN58gf1seETS95w7w2O0kWPWM9N2V2ZVx7KDpuiMS8K71befMWBKgzuvXbp3fNLTxgV+Qyz9H+xzNA1I+LpGWnPkxEnu0Or7dmwOTDNG0oaRnqw8akxI8p+10IitSUGmHbt3ACb95vSGlNaP7ATdF9bKBABYgjIgSECdi9otHN+TJ1tr/Vivf80o+ssOZXtt78U7r/K3VsgzV06E13SOQuY/O6E881kEzwuZAJ1Z3fkKI/3dUseyIAzvea5ea2PRvVvtgNPptNwWO3LDCUY2ov5/9VBwfJIrVJleW2Q==
PublicExponent: AQAB
PrivateExponent: Dy/8LRu/FpP2ucfpzmtL8CnOPXCdwl/h+PHS3ZRW9Zzynjz6wvOzOWr3XOMALyrzP3jB9/TMJuo9T5I+63o9UXhyjkORxFikKZU/J6f9nAD9Jt1JWbJO03CSJkgqrdEGilvwv6rU7Tzbmsj+yu2zWioLUDKqDf57XjvhGUEqJyi4vpKVJB5X+v3dOlta2Uz1Fc22Zbz6yXyH/hOn3NI2kIuQH36ozh3V5KzqTwVNXkHONd2zAEUMwlduV4Iad+rq6jXpLyYqCBoHzG/McHiAgULFTi27fS6OU+AMN5IkqM9zTftXcPNTQxSMTHZOmaSDIY75QY81j0iMYgqzjHT8kQ==
Prime1: +s+mGMWMnkHMq3jqAmqmQOEhIinui6HisIEc7RMOtwg+e09li96D4AiQIp3nagYFKs1lkmpMc6FMiX+/DUwi+EpS0jH8z9eGPjSctvzXAkL9zIE2To6ndxcKxnv7f3XdpvhrdzOxx04TbreZTrBx+tdXOor6iHpTHxYlUOih1dU=
Prime2: 24jEQmwgDuFP0oz8SQKUVzDEa//ynnjiWYhnlsXYs3MBGdmgzex3baTlBTJyGIoMiRpTb+ZqGa8H7/bBZvtBYUQRjou9oz0vTeWUI1zO7M6JBc6wHw/x83zXUF2mVJSwollkB4TY2C71CvGt6VL2bxKviPgemXag1puV6ChdKvU=
Exponent1: wFGrTkFk0xEnbLC514KJ2yQF8RlwJjfLCIbodE1xsh2rM4itF/RW8NoAE9s60IyvN6Pp57yExQGBG8oN6JdiFTuAiFb2QTVFZbuYE6SLBdvymvbVeqVeei38ADifn5v0i4zfcrb78hTHR9WWw8T+kVbAN07MTwxlYmfr0z+eoMU=
Exponent2: w4sL/XogCAELP6kS4tloVk16+BPwANX+D+/fDT5HKngqp+LgR+vz6Pbyg/GODWuRhOGtJkQfh6cPM+AgHuF4N/IQjV7NWMScCQ+QJvt42ReSl1imKdTjF5XAl7YC/N3Ag6uJ3OSo3c7dt5TT6rtaBE+piSAw6VLwKphFK5ggfK0=
Coefficient: 0NnJiHn8kdLbmveOsjpRoDVCoIKUBdU2PtJ2AEsVC+Ik0IS8AnILZPNIW2Obfq6k14eL+0t7YKFtOMhK2YoCgTXrfvs6R6IGjtHcCubRuB4n/+SUi6Npp1W23Mm5d2EP/5cuvpwfRbZw5jXztWWi8Dm1dvnPes5irKywxT90sPk=
+1
View File
@@ -0,0 +1 @@
com. IN DS 58851 13 2 e957262b9b036e703d765c9027c96ee65cffac373f4d4876a472544a369e4389
+1
View File
@@ -0,0 +1 @@
com. IN DNSKEY 257 3 13 5imDagGYqsnL94awk/5ksPGFTwljcSdD8c1fb4Ra6YFrl4ouTtViaxltCmO9UTxhGZyVQw1uZP9ybKZ/LOPKhA== ;{id = 58851 (ksk), size = 256b}
+3
View File
@@ -0,0 +1,3 @@
Private-key-format: v1.2
Algorithm: 13 (ECDSAP256SHA256)
PrivateKey: AnimGdyeT5/DW0Fxycd/p/tlp7nxhfKIs3tWW0VNUpQ=
+1
View File
@@ -0,0 +1 @@
com. IN DNSKEY 256 3 13 SLyxevZzrkRhtnu+aYGtBR+L9H/XblWH5BJaKXNIngQGxbq0ndYsh6WJ6eT4dNSgJBbNOyb+9j9RRFZ8exatug== ;{id = 61184 (zsk), size = 256b}
+3
View File
@@ -0,0 +1,3 @@
Private-key-format: v1.2
Algorithm: 13 (ECDSAP256SHA256)
PrivateKey: +LpdTtg6ywWsDoCgsZcPsH75QB/6c7r729iQwtEfSRU=
+1
View File
@@ -0,0 +1 @@
de. IN DNSKEY 256 3 13 aIeDl5iVgvAmhjSSrRWlTDiI8qv3QkhL3Ee6Yx8WaizAj435c3wlle8mLRwds/JDLIc1XdIHljM2QBNADTwOFQ== ;{id = 34467 (zsk), size = 256b}
+3
View File
@@ -0,0 +1,3 @@
Private-key-format: v1.2
Algorithm: 13 (ECDSAP256SHA256)
PrivateKey: hsRJU36yxfcST9Td0wPSD5gxtEZX9LOdDg6naK/XVek=
+1
View File
@@ -0,0 +1 @@
de. IN DS 38315 13 2 79925d41ed74d5c19897298ca65a56a3bd5610b3973f6644cd630d6473136768
+1
View File
@@ -0,0 +1 @@
de. IN DNSKEY 257 3 13 cvUOUrn951Sp1LdhVi2kuYoLgINVMbFHWihMqRrjyblIRom84U5GETRjEGTQSnxhnTmvU4KA3OdL7RxX+pTcyQ== ;{id = 38315 (ksk), size = 256b}
+3
View File
@@ -0,0 +1,3 @@
Private-key-format: v1.2
Algorithm: 13 (ECDSAP256SHA256)
PrivateKey: w9Ej919ybNZH3zOgx6ssOiA/lm+1l7hEy+wOa9rmGmQ=
+1
View File
@@ -0,0 +1 @@
example.com. IN DS 23561 13 2 3a574940d1cad2532def4debb31d22d971ca762c6aa345d40a91475129c42570
+1
View File
@@ -0,0 +1 @@
example.com. IN DNSKEY 257 3 13 6W4xnMJ+f3Tzdat5635hP6KhMblsaeJDPijAqkVAotZGjXvBs5KWTyZiiXYJ/rNcAi3xf+TbQ4NOgOD7lwapaQ== ;{id = 23561 (ksk), size = 256b}
+3
View File
@@ -0,0 +1,3 @@
Private-key-format: v1.2
Algorithm: 13 (ECDSAP256SHA256)
PrivateKey: cbikm3oKmwSAh0Qk+FrW8OkC3aG1eJ6YckNEe0fPVhI=
+1
View File
@@ -0,0 +1 @@
example.com. IN DNSKEY 256 3 13 He3P9aBLDe2L9MeQfGU96jnOrULzhRVqHkYuhBLtmY19zgVdvHFcgvtMBZdns36De5hPuzD1Hhi982d1uxFcuQ== ;{id = 29203 (zsk), size = 256b}
+3
View File
@@ -0,0 +1,3 @@
Private-key-format: v1.2
Algorithm: 13 (ECDSAP256SHA256)
PrivateKey: 7ZB9TPwKwcrl8BJTM57NwmLVBWkHEHgT0vvaxU+Ea+A=
+1
View File
@@ -0,0 +1 @@
lol. IN DNSKEY 256 3 13 qtPP4BxrXvvOO99FMDwfAv+++uKw2IgHDfnIKvkKuAImtm+FxWltKZrPH6j+p9yFRNBO/qv+4gAAMzuxb1OD3Q== ;{id = 24819 (zsk), size = 256b}
+3
View File
@@ -0,0 +1,3 @@
Private-key-format: v1.2
Algorithm: 13 (ECDSAP256SHA256)
PrivateKey: SlLac4QRP5444d5A/cbO272zcIPsgdagmedIqeaguac=
+1
View File
@@ -0,0 +1 @@
lol. IN DS 46946 13 2 f3c77deac149c47fc5d17a215b8f8c4d4abf6ee23f5387be7d4cbb27dbd9bb59
+1
View File
@@ -0,0 +1 @@
lol. IN DNSKEY 257 3 13 9unhRHjEydG37e0u0bzkpTG0XlkSloHsEDjOF85+ui2IOsq7K4jCcU+v5/7/VGcW1sVaq2FxKOYDSTOR9BPrwg== ;{id = 46946 (ksk), size = 256b}
+3
View File
@@ -0,0 +1,3 @@
Private-key-format: v1.2
Algorithm: 13 (ECDSAP256SHA256)
PrivateKey: O6DLICCRtuP35PBQ/D8x836twzkRs1zLHIwqBUsQgQQ=
+1
View File
@@ -0,0 +1 @@
nu. IN DNSKEY 256 3 13 JntbD9Cr13hV9CJ/yVmCxqKP9/L5PGlEGCpm70NTW46JQzKF/Lt4rT7kOJbr++TIMBTEdvbSXsdBCrdF97dzWw== ;{id = 13385 (zsk), size = 256b}
+3
View File
@@ -0,0 +1,3 @@
Private-key-format: v1.2
Algorithm: 13 (ECDSAP256SHA256)
PrivateKey: HLKZapHzNPUvS5ytkAcNvL2piDJbggAmQYFdQzNgoRY=
+1
View File
@@ -0,0 +1 @@
nu. IN DS 20506 13 2 ac1ebb0d02e806ba954c9811bcc66ab170c5e7f5d1f13ea53992d2a226ff8315
+1
View File
@@ -0,0 +1 @@
nu. IN DNSKEY 257 3 13 suRmDGHQyN2y1aCCsNl2EH/coH/KdI8KclkZgL2SlVZLHMmr2Ulh54VfkLVNZJLTcaN8Er/D/Q+1zXxQ3wszkg== ;{id = 20506 (ksk), size = 256b}
+3
View File
@@ -0,0 +1,3 @@
Private-key-format: v1.2
Algorithm: 13 (ECDSAP256SHA256)
PrivateKey: FYTEa22T+x2MDf36YerBev5XtFuRu7NASiokJP7aA9o=
+1
View File
@@ -0,0 +1 @@
ovh. IN DNSKEY 256 3 13 lSU7WAWah8/gXUpcisaxV10tVo+54pAcTQcyGT/46oBSpCXzocLG4nSrA1gEvYBu8H2/Lg922E/CYsEF00jSug== ;{id = 3949 (zsk), size = 256b}
+3
View File
@@ -0,0 +1,3 @@
Private-key-format: v1.2
Algorithm: 13 (ECDSAP256SHA256)
PrivateKey: StAFkrSunwzjRAioiFLiD5nL31Q2G0nTDHmedO9yALY=
+1
View File
@@ -0,0 +1 @@
ovh. IN DS 54922 13 2 4c3fcc2b8d24d3e0a46e364857186f4b4d4e9365071106d5a6487bc9795b5765
+1
View File
@@ -0,0 +1 @@
ovh. IN DNSKEY 257 3 13 wV6OoOkqw+WO9LWafC5W9vdyLxRzzmuJi4laQ9FYpDt9PNDkNSKBPJZpm09l5B6mHfWHKr5XOkPM6BiV4kA8Ow== ;{id = 54922 (ksk), size = 256b}
+3
View File
@@ -0,0 +1,3 @@
Private-key-format: v1.2
Algorithm: 13 (ECDSAP256SHA256)
PrivateKey: 0COmnLjG5oq0o+XCzhhEitSVOayjZJ3xdjjwTQGWFHQ=
+1
View File
@@ -0,0 +1 @@
se. IN DNSKEY 256 3 13 eRPqHQ/hNK1d+JaVCzDK1DlQ8ztGM4V+qGLHGDQBNtC5ezgFoRGGCzJIIDl9fYaNm2VqV2X1W8aqFkLhfCUdmw== ;{id = 1606 (zsk), size = 256b}
+3
View File
@@ -0,0 +1,3 @@
Private-key-format: v1.2
Algorithm: 13 (ECDSAP256SHA256)
PrivateKey: B3IgNdfgyCTvyoAC0Xqh9JV4UvoXgWQmM5ClKkUUsYg=
+1
View File
@@ -0,0 +1 @@
se. IN DS 17203 13 2 44a6f19f0d8c797e4de35a64a0d56ad18adfa9cd24de9ea0e193390602cae6aa
+1
View File
@@ -0,0 +1 @@
se. IN DNSKEY 257 3 13 noRN6Q3QSNupXU6+heo/P7XjJw9GSAcavFcC0VK9RJ8BJUFDbzRNUxVWQ02xvjGsQGxYs+E6KaYcJhvDQfxlBw== ;{id = 17203 (ksk), size = 256b}
+3
View File
@@ -0,0 +1,3 @@
Private-key-format: v1.2
Algorithm: 13 (ECDSAP256SHA256)
PrivateKey: AsAzvuJJmpcIIEXPu+yhluu7AKcfmBDWdE0uX7Pxc2A=
+1
View File
@@ -0,0 +1 @@
target/release/dnst
+1
View File
@@ -0,0 +1 @@
target/release/dnst
+1
View File
@@ -0,0 +1 @@
target/release/dnst
+1
View File
@@ -0,0 +1 @@
target/debug/dnst
+9
View File
@@ -0,0 +1,9 @@
error: a value is required for '-f <file>' but none was supplied
For more information, try '--help'.
Loading private key from './Kcom.+013+58851.private'
Loading public key from './Kcom.+013+58851.key'
Loading private key from './Kcom.+013+61184.private'
Loading public key from './Kcom.+013+61184.key'
Loading zone from '/etc/nsd/zones/verisign/com.zone'
+25114
View File
File diff suppressed because it is too large Load Diff
+20875
View File
File diff suppressed because it is too large Load Diff
+25117
View File
File diff suppressed because it is too large Load Diff
+2 -11
View File
@@ -9,7 +9,7 @@ use std::ffi::OsString;
use std::fmt;
use std::fs::File;
use std::hash::RandomState;
use std::io::{self, BufWriter, IsTerminal};
use std::io::{self, BufWriter};
use std::path::{Path, PathBuf};
// TODO: use a re-export from domain?
@@ -941,16 +941,7 @@ impl SignZone {
}
fn write_iterations_warning(env: &impl Env, text: &str) {
if std::io::stderr().is_terminal() {
write!(
env.stderr(),
"{}",
Error::colourize(Error::YELLOW, "Warning!")
);
} else {
write!(env.stderr(), "Warning!")
}
writeln!(env.stderr(), " {}", text);
Error::write_warning(&mut env.stderr(), text);
writeln!(
env.stderr(),
"See: https://www.rfc-editor.org/rfc/rfc9276.html"
+2 -2
View File
@@ -51,11 +51,11 @@ impl Env for FakeEnv {
}
fn stdout(&self) -> Stream<impl fmt::Write> {
Stream(self.stdout.clone())
Stream::new(self.stdout.clone(), false)
}
fn stderr(&self) -> Stream<impl fmt::Write> {
Stream(self.stderr.clone())
Stream::new(self.stderr.clone(), false)
}
fn in_cwd<'a>(&self, path: &'a impl AsRef<Path>) -> Cow<'a, Path> {
+30 -3
View File
@@ -35,21 +35,48 @@ pub trait Env {
/// [`std::io::Write`]. Additionally, this `write_fmt` does not return a
/// result. This means that we can use the [`write!`] and [`writeln`] macros
/// without handling errors.
pub struct Stream<T: fmt::Write>(T);
pub struct Stream<T: fmt::Write> {
writer: T,
is_terminal: bool,
}
impl<T: fmt::Write> Stream<T> {
pub fn new(writer: T, is_terminal: bool) -> Self {
Self { writer, is_terminal }
}
pub fn write_fmt(&mut self, args: fmt::Arguments<'_>) {
// This unwrap is not _really_ safe, but we are using this as stdout.
// The `println` macro also ignores errors and `push_str` of the
// fake stream also does not return an error. If this fails, it means
// we can't write to stdout anymore so a graceful exit will be very
// hard anyway.
self.0.write_fmt(args).unwrap();
self.writer.write_fmt(args).unwrap();
}
pub fn write_str(&mut self, s: &str) {
// Same as with write_fmt...
self.0.write_str(s).unwrap();
self.writer.write_str(s).unwrap();
}
pub fn is_terminal(&self) -> bool {
self.is_terminal
}
pub fn colourize(&self, colour_code: u8, text: &str) -> String {
// 1B is the ASCII C0 ESC control code that introduces an ANSI escape
// sequence, 31 is the ANSI escape sequence for setting the terminal
// foreground colour to red, and 0 resets all attributes to their
// defaults.
//
// See:
// - https://en.wikipedia.org/wiki/ANSI_escape_code#C0_control_codes
// - https://en.wikipedia.org/wiki/ANSI_escape_code#Colors
if self.is_terminal {
format!("\x1B[{colour_code}m{text}\x1B[0m")
} else {
text.to_string()
}
}
}
+3 -3
View File
@@ -1,6 +1,6 @@
use std::ffi::OsString;
use std::fmt;
use std::io;
use std::io::{self, IsTerminal};
use std::path::Path;
use super::Env;
@@ -15,11 +15,11 @@ impl Env for RealEnv {
}
fn stdout(&self) -> Stream<impl fmt::Write> {
Stream(FmtWriter(io::stdout()))
Stream::new(FmtWriter(io::stdout()), io::stdout().is_terminal())
}
fn stderr(&self) -> Stream<impl fmt::Write> {
Stream(FmtWriter(io::stderr()))
Stream::new(FmtWriter(io::stderr()), io::stderr().is_terminal())
}
fn in_cwd<'a>(&self, path: &'a impl AsRef<Path>) -> std::borrow::Cow<'a, std::path::Path> {
+13 -23
View File
@@ -1,7 +1,7 @@
use std::fmt;
use std::fmt::{self, Display, Write};
use std::{error, io};
use crate::env::Env;
use crate::env::{Env, Stream};
//------------ Error ---------------------------------------------------------
@@ -58,7 +58,6 @@ impl Error {
/// Pretty-print this error.
pub fn pretty_print(&self, env: impl Env) {
use std::io::IsTerminal;
let mut err = env.stderr();
let error = match &self.0.primary {
@@ -75,16 +74,7 @@ impl Error {
// NOTE: This is a multicall binary, so argv[0] is necessary for
// program operation. We would fail very early if it didn't exist.
let prog = std::env::args().next().unwrap();
let term = std::io::stderr().is_terminal();
let error_marker = if term {
Self::colourize(Self::RED, "ERROR:")
} else {
"ERROR:".to_string()
};
write!(err, "[{prog}] {error_marker} {error}");
Self::write_error(&mut err, error);
for context in &self.0.context {
writeln!(err, "\n... while {context}");
}
@@ -105,16 +95,16 @@ impl Error {
}
}
pub fn colourize(colour_code: u8, text: &str) -> String {
// 1B is the ASCII C0 ESC control code that introduces an ANSI escape
// sequence, 31 is the ANSI escape sequence for setting the terminal
// foreground colour to red, and 0 resets all attributes to their
// defaults.
//
// See:
// - https://en.wikipedia.org/wiki/ANSI_escape_code#C0_control_codes
// - https://en.wikipedia.org/wiki/ANSI_escape_code#Colors
format!("\x1B[{colour_code}m{text}\x1B[0m")
pub fn write_error(writer: &mut Stream<impl Write>, text: impl Display) {
let prog = std::env::args().next().unwrap();
let marker = writer.colourize(Self::RED, "ERROR:");
writeln!(writer, "[{prog}] {marker} {text}");
}
pub fn write_warning(writer: &mut Stream<impl Write>, text: impl Display) {
let prog = std::env::args().next().unwrap();
let marker = writer.colourize(Self::YELLOW, "WARN:");
writeln!(writer, "[{prog}] {marker} {text}");
}
}