use types::c; use fmt; export type CURL = opaque; export type CURLcode = int; export type CURLINFO = int; def CURLOPT_URL = 10002; def CURLINFO_LONG = 0x200000; def CURLINFO_RESPONSE_CODE = CURLINFO_LONG + 2; export @symbol("curl_easy_init") fn curl_easy_init() nullable *CURL; export @symbol("curl_easy_cleanup") fn curl_easy_cleanup(handle: nullable *CURL) void; export @symbol("curl_easy_setopt") fn curl_easy_setopt( handle: nullable *CURL, option: int, parameter: const *c::char ) CURLcode; export @symbol("curl_easy_perform") fn curl_easy_perform(easy_handle: nullable *CURL) CURLcode; export @symbol("curl_easy_getinfo") fn curl_easy_getinfo( easy_handle: nullable *CURL, info: CURLINFO, code: nullable *c::long ) CURLcode; type curlerror = !(str, int); fn get(url: str) (void | curlerror) = { let c = curl_easy_init(); defer curl_easy_cleanup(c); let c_url = c::fromstr(url); defer free(c_url); let res = curl_easy_setopt(c, CURLOPT_URL, c_url); if (res != 0) { return ("setopt", res): curlerror; }; res = curl_easy_perform(c); if (res != 0) { return ("perform", res): curlerror; }; let rc: c::long = 0; curl_easy_getinfo(c, CURLINFO_RESPONSE_CODE, &rc); fmt::println(rc)!; }; export fn main() void = { match (get("https://harelang.org")) { case void => yield; case let err: curlerror => fmt::fatalf("{} returned {} instead of 0", err.0, err.1); }; };