about summary refs log tree commit diff
path: root/users/Profpatsch
diff options
context:
space:
mode:
authorProfpatsch <mail@profpatsch.de>2021-02-09T00·38+0100
committerProfpatsch <mail@profpatsch.de>2021-02-09T01·36+0000
commit2f3e4ec3caae60afc6dd37f0a3bedd150437436f (patch)
tree28c7230825931aa70fd67bda7012d4d796a0f7ad /users/Profpatsch
parentfd0d0764ecd67d82fb331074a47a6f8c089b81ce (diff)
feat(users/Profpatsch/read-http): use netencode::dec for arglib r/2195
Interestingly, the code is not any shorter, but a lot more
declarative, and all parsing footwork and error message generation is
done by the `Decoder` trait. \o/

Change-Id: Idb1064a3b5198e38e06e1860d4d71054ae53bbb9
Reviewed-on: https://cl.tvl.fyi/c/depot/+/2499
Tested-by: BuildkiteCI
Reviewed-by: Profpatsch <mail@profpatsch.de>
Diffstat (limited to 'users/Profpatsch')
-rw-r--r--users/Profpatsch/read-http.rs27
1 files changed, 13 insertions, 14 deletions
diff --git a/users/Profpatsch/read-http.rs b/users/Profpatsch/read-http.rs
index 0c168a733831..afbfbfdb6714 100644
--- a/users/Profpatsch/read-http.rs
+++ b/users/Profpatsch/read-http.rs
@@ -10,7 +10,8 @@ use std::io::Write;
 use std::collections::HashMap;
 use exec_helpers::{die_user_error, die_expected_error, die_temporary};
 
-use netencode::{U, T};
+use netencode::{U, T, dec};
+use netencode::dec::Decoder;
 
 enum What {
     Request,
@@ -21,20 +22,18 @@ enum What {
 // The keys are text, but can be lists of text iff headers appear multiple times, so beware.
 fn main() -> std::io::Result<()> {
 
-    let what : What = match arglib_netencode::arglib_netencode("read-http", None) {
-        T::Record(rec) => match rec.get("what") {
-            Some(T::Text(t)) => match t.as_str() {
-                "request" => What::Request,
-                "response" => What::Response,
-                _ => die_user_error("read-http", "`what` should be either t:request or t:response"),
-            },
-            Some(o) => die_user_error("read-http", format!("expected a record of text, got {:#?}", o)),
-            None => {
-                eprintln!("read-http arglib: no `what` given, defaulting to Response");
-                What::Response
-            }
+    let args = dec::RecordDot {
+        field: "what",
+        inner: dec::OneOf {
+            list: vec!["request", "response"],
+            inner: dec::Text
         }
-        o => die_user_error("read-http arglib", format!("expected a record, got {:#?}", o))
+    };
+    let what : What = match args.dec(arglib_netencode::arglib_netencode("read-http", None).to_u()) {
+        Ok("request") => What::Request,
+        Ok("response") => What::Response,
+        Ok(v) => panic!("shouldn’t happen!, value was: {}", v),
+        Err(dec::DecodeError(err)) => die_user_error("read-http", err),
     };
 
     fn read_stdin_to_complete<F>(mut parse: F) -> ()