view src/requests.tp @ 22:a4837071b73d

some attempts at parsing an eval response
author William Morgan <bill@mrgn.org>
date Sat, 10 Aug 2013 03:31:50 -0700
parents a4ac42c69285
children fcd7ae66a9ee
line wrap: on
line source

#{

	strJoin <- :str arr {
		acc <- ""
		arr foreach: :i el {
			if: i = 0 {
				acc <- (string: el)
			} else: {
				acc <- acc . ", " . (string: el)
			}
		}
		acc
		//arr fold: "" with: :acc el {acc . el}
	}

	quote <- :str {
		"\"" . str . "\"" 
	}

	evalRequest <- :id args {
		#{
			string <- {
				idStr <- (quote: "id") . ":" . (quote: id)
				argsStr <- (quote: "arguments") . ":" . (quote: (strJoin: "," args))
				"{" . idStr . "," . argsStr . "}"
			}
		}
	}

	guessRequest <- :id :prog {
		#{
			string <- {
				idStr <- "\"id\":\"" . id . "\""
				progStr <- "\"program\":\"" . prog . "\""
				"{" . idStr . "," . progStr . "}"
			}
		}
	}






	expect:in <- :target input {
		input find: target else: {
			print: "expected " . target . "!\n" 
			-1
			//exit, it's all fucked now
		}		
	}

	quotedVal <- :str {
		str find: "\"" else: {
			"expected
		}
	}

	jsonVal:in <- :target input {
		idx <- expect: target in: input
		nextQuoteIdx <- idx + 
		quotedVal: idx
	}	

	evalResponse <- :str {
		str find: "status" else: {print: missing}
		statIdx <- expect: "status" in: str
		status <- requireK
		
		#{
			status <- 
			outputs <- parseArray(input)
			message <- 
		}
	}


	println: str {
		print: str . "\n"
	}

	readObject <- :str {
		expect "{"
		readObjectContents: 
		expect "}"
	}

	readObject <- :str {
		innerStr <- readEnclosed: "{" "}"
		elems <- split: ","
	}
	
	evalResponse <- :str {
		status <- readValForKey: "status" str
		if status = "error" {
			
		} else { 
			if status = "ok" {
				#{
					readEvalOutputs: 
				}
			}
		}
		
	}

	expect:in:else <- :target src doElse {
		src find: target else: {
			print: "parse error: expected " . target . "!\n" 
			doElse:
		}		
	}

	getStrForKey:from:else <- :key :src :doElse {
		idx <- expect: "\"" in: src else: doElse
		idx + (key length):
	}

	getEval:else <- :str :fail {
		statusRest <- getStrForKey: "status" from: str else: fail
		if (statusRest value) = 0 {
			outputsRest <- getOutputs: (statusRest rest) else: fail
			#{
				value <- #{
					status <- statusRest.value
					outputs <- outputsRest.value
				}
				rest <- outputsRest.rest
			}
		} else {
			print: "Status was error, message: " . message
			#{
				message <- getStrForKey: "message" from: (statusRest rest) else: fail
				value <- #{
					status <- statusRest.value
					message <- outputsRest.value
				}
				rest <- outputsRest.rest
			}
		}
	}



	main <- {
		print: ((evalRequest: "someId" #[1 2i64 3i64]) string) . "\n"
		print: ((guessRequest: "someId" "someProg") string) . "\n"

		exampleEvalResponse <- "{\"status\":\"ok\",\"outputs\":[\"0x0000000000000002\",\"0x01DFFFFFFFFFFFFE\"]}"
		resp <- getEval: exampleEvalResponse else: {
			println: "failed to parse response."
		}
		println: ((resp value) status)
	}

}