Let's write β

プログラミング中にできたことか、思ったこととか

RustでAPI Wrapperを簡単に書くためのライブラリを書いている

Swiftで書かれたAPKitというライブラリ:

github.com

は非常に綺麗に作られていて、便利ですし更新も活発なので非常に気に入っていて、時々コントリビュートしながら
自社プロダクトでも採用しているのですが、Rustで遊んでいる時にこれと同じようなライブラリがあったら嬉しいなぁとお思い
以下のようにプロトタイプを作っています。

github.com

以下の感じで、実装してsendRequestできるという感じの方針で進めたいと思っています。

APIKitは要所要所を抑えて適切にユーザー側で拡張できるようになっているので、非常に便利で
使いやすいので皆さんも是非iOSの開発等で利用してみてください。

extern crate api_kit;
extern crate hyper;
extern crate serde_json; 

use hyper::client::response::Response;
use hyper::client::RequestBuilder;
use api_kit::api_request::ApiRequest;
use api_kit::api_request::HttpMethod;
use hyper::header::{Headers, Accept, qitem};
use hyper::mime::{Mime, TopLevel, SubLevel, Attr, Value};
use std::io::{Read};

struct CircleCiMeRequest<'a> {
    api_token: &'a str
}

impl<'a> CircleCiMeRequest<'a> {
    fn new(token: &'a str) -> CircleCiMeRequest {
        return CircleCiMeRequest { api_token: token };
    }
}

impl<'a> ApiRequest<serde_json::Value> for CircleCiMeRequest<'a> {
    fn base_url(&self) -> &str {
        return "https://circleci.com/api/v1.1";
    }
    
    fn method(&self) -> HttpMethod {
        return HttpMethod::GET;
    }
    
    fn path(&self) -> &str {
        return "/me";
    }
    
    fn queryParameters(&self) -> Vec<(&str, &str)> {
        return vec![
            ("circle-token", self.api_token)
        ];
    }
    
    fn interceptRequest<'b>(&self, requestBuilder: RequestBuilder<'b>) -> RequestBuilder<'b> {
        let mut headers = Headers::new();
        headers.set(
                    Accept(vec![
                        qitem(Mime(TopLevel::Application, SubLevel::Json,
                                   vec![(Attr::Charset, Value::Utf8)])),
                    ])
                );
        return requestBuilder.headers(headers);
    }
    
    fn responseFromObject(&self, response: &mut Response) -> Option<serde_json::Value> {
        let mut buffer = String::new();
        response.read_to_string(&mut buffer).unwrap();
        return Some(serde_json::from_str(&buffer).unwrap());
    }
}

fn main() {
    let me = api_kit::sendRequest(&CircleCiMeRequest::new("<your circle ci api token>"));
    println!("{}", me.unwrap());
}

さて、僕が働いているAzit.incでは一緒に働けるエンジニアを募集しています!
採用情報 — 株式会社アジット|Azit Inc.