Skip to content

Instantly share code, notes, and snippets.

@sdorunga
Last active July 7, 2016 17:43
Show Gist options
  • Save sdorunga/27a967d317b3748974c953bc339c4b61 to your computer and use it in GitHub Desktop.
Save sdorunga/27a967d317b3748974c953bc339c4b61 to your computer and use it in GitHub Desktop.
use "net/http"
use "json"
actor Main
new create(env: Env) =>
let usernames = env.args.values()
for username in usernames do
Request.create(env).get(username)
end
actor Request
let _env : Env
new create(env: Env) =>
_env = env
be get(username: String) =>
try
let url = URL.build("https://api.github.com/users/" + username)
var handler = LoginPrinter.create(_env)
let request = Payload.request("GET", url, handler)
request.update("User-Agent", "Pony")
Client.create(_env.root as AmbientAuth).apply(consume request)
end
class LoginPrinter
var _env : Env
new val create(env: Env) =>
_env = env
fun apply(request: Payload val, response: Payload val) =>
if response.status != 0 then
let chunks = response.body().values()
try
for chunk in chunks do
match JsonParser.parse_json(chunk)
| let x: JsonObject => _env.out.print(x.data("name") as String)
| let x: None => _env.out.print("Hello")
end
end
end
end
class JsonParser
fun parse_json(json_response: ByteSeq): (JsonObject | None) =>
let json_string = parse_response(json_response)
try
let json: JsonDoc = JsonDoc
json.parse(json_string)
json.data as JsonObject
end
fun parse_response(response: ByteSeq): String =>
match response
| let x: String => x
| let x: Array[U8 val] val => String.from_array(x)
else ""
end
@doublec
Copy link

doublec commented Jul 6, 2016

chunk needs a match to handle the case of it being a String or a Array[U8 val] val. The json object is modified by the parse call, parse doesn't return anything. Working code is:

  try
    for chunk in chunks do
      let s: String =
        match chunk
        | let x: String => x
        | let x: Array[U8 val] val => String.from_array(x)
        else ""
        end
      let json: JsonDoc = JsonDoc
      json.parse(s)
      let obj = json.data as JsonObject
      _env.out.print(obj.data("login") as String)
    end

@sdorunga
Copy link
Author

sdorunga commented Jul 7, 2016

Thanks @doublec it all works fine now. That was driving me crazy :)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment