Mercurial > repos > icfp2013
comparison src/requests.tp @ 25:bb80f86c5048
Added code for sending and decoding the responses of evalRequests
author | Mike Pavone <pavone@retrodev.com> |
---|---|
date | Sat, 10 Aug 2013 16:31:48 -0700 |
parents | e1109e33b796 |
children | 18a043613dae |
comparison
equal
deleted
inserted
replaced
24:e1109e33b796 | 25:bb80f86c5048 |
---|---|
22 } | 22 } |
23 | 23 |
24 | 24 |
25 | 25 |
26 | 26 |
27 evalRequest <- :id args { | 27 evalId <- :id args { |
28 #{ | 28 #{ |
29 string <- { | 29 string <- { |
30 idStr <- (quote: "id") . ":" . (quote: id) | 30 idStr <- (quote: "id") . ":" . (quote: id) |
31 argsStr <- (quote: "arguments") . ":" . (quote: (strJoin: "," args)) | 31 argsStr <- (quote: "arguments") . ":" . (quote: (strJoin: "," args)) |
32 "{" . idStr . "," . argsStr . "}" | 32 "{" . idStr . "," . argsStr . "}" |
33 } | |
34 } | |
35 } | |
36 | |
37 evalProgram <- :program args { | |
38 args <- args map: :el { | |
39 "\"0x" . (hex: el) . "\"" | |
40 } | |
41 #{ | |
42 string <- { | |
43 progStr <- (quote: "program") . ":" . (quote: program) | |
44 argsStr <- (quote: "arguments") . ":[" . (strJoin: "," args) . "]" | |
45 "{" . progStr . "," . argsStr . "}" | |
46 } | |
47 sendWithKey <- :key { | |
48 print: "Sending: " . string . "\n" | |
49 cli <- http client: "icfpc2013.cloudapp.net" | |
50 resp <- cli post: string toPath: "/eval?auth=" . key withType: "application/json" | |
51 evalResponse: resp | |
33 } | 52 } |
34 } | 53 } |
35 } | 54 } |
36 | 55 |
37 guessRequest <- :id :prog { | 56 guessRequest <- :id :prog { |
42 "{" . idStr . "," . progStr . "}" | 61 "{" . idStr . "," . progStr . "}" |
43 } | 62 } |
44 } | 63 } |
45 } | 64 } |
46 | 65 |
47 | 66 evalResponse <- :httpResp { |
48 | 67 _code <- httpResp statusCode |
49 | 68 bod <- httpResp body |
50 | 69 print: "Response code: " . (string: _code) . "\n" |
51 expect:in:else <- :target src doElse { | 70 print: bod . "\n" |
52 src find: target else: { | 71 decoded <- json decode: bod |
53 print: "parse error: expected " . target . "!\n" | 72 _status <- "error" |
54 doElse: | 73 if: _code = 200 { |
74 _status <- decoded get: "status" withDefault: "error" | |
75 } else: { | |
76 print: "bad status" | |
55 } | 77 } |
56 } | 78 if: _status = "ok" { |
57 | 79 _outputs <- (decoded get: "outputs" withDefault: #[]) map: :num { |
58 getStrForKey:from:else <- :key :src :doElse { | 80 (num from: 2) parseHex64 |
59 firstKeyQuote <- expect: "\"" in: src else: doElse | 81 } |
60 secondQuote <- firstKeyQuote + 1 + (key length) | |
61 | |
62 #{ | |
63 value <- "" | |
64 rest <- src from: (value length) | |
65 } | |
66 } | |
67 | |
68 getOutputs:else <- :str :fail { | |
69 | |
70 } | |
71 | |
72 getEval:else <- :str :fail { | |
73 statusRest <- getStrForKey: "status" from: str else: fail | |
74 if: (statusRest value) = "ok" { // string equality? revisit. | |
75 outputsRest <- getOutputs: (statusRest rest) else: fail | |
76 #{ | 82 #{ |
77 value <- #{ | 83 status <- { "ok" } |
78 status <- statusRest value | 84 outputs <- { _outputs } |
79 outputs <- outputsRest value | 85 string <- { |
86 str <- "OK:" | |
87 foreach: _outputs :idx val { | |
88 str <- str . "\n" . (string: idx) . ": 0x" . (hex: val) | |
89 } | |
90 str | |
80 } | 91 } |
81 rest <- outputsRest rest | 92 print <- { |
93 print: string . "\n" | |
94 } | |
82 } | 95 } |
83 } else: { | 96 } else: { |
84 message <- "" | 97 _message <- decoded get: "message" withDefault: "" |
85 print: "Status was error, message: " . message | |
86 messageRest <- getStrForKey: "message" from: (statusRest rest) else: fail | |
87 #{ | 98 #{ |
88 value <- #{ | 99 status <- { "error" } |
89 status <- statusRest value | 100 message <- { _message } |
90 message <- messageRest value | 101 string <- { |
102 "Error: " . _message | |
91 } | 103 } |
92 rest <- messageRest rest | 104 print <- { |
105 print: string . "\n" | |
106 } | |
93 } | 107 } |
94 } | 108 } |
95 } | 109 } |
96 | 110 |
97 | 111 main <- :args { |
98 | 112 print: ((evalId: "someId" #[1u64 2u64 3u64]) string) . "\n" |
99 main <- { | |
100 print: ((evalRequest: "someId" #[1 2i64 3i64]) string) . "\n" | |
101 print: ((guessRequest: "someId" "someProg") string) . "\n" | 113 print: ((guessRequest: "someId" "someProg") string) . "\n" |
102 | 114 |
103 exampleEvalResponse <- "{\"status\":\"ok\",\"outputs\":[\"0x0000000000000002\",\"0x01DFFFFFFFFFFFFE\"]}" | 115 if: (args length) > 1 { |
104 resp <- getEval: exampleEvalResponse else: { | 116 key <- args get: 1 |
105 println: "failed to parse response." | 117 print: ((evalProgram: "(lambda (input) (shl1 input))" #[1u64 0xEFFFFFFFFFFFFFu64]) sendWithKey: key) |
106 } | 118 } |
107 println: ((resp value) status) | |
108 } | 119 } |
109 | |
110 } | 120 } |