私は自分のsoup.ioブログ用に単純な錆びたrss「ハーベスター」を構築し、それらのエントリをnode.jsでディアスポラに投稿しようとしていました(そのためのnpmパッケージがあるため)
ノードから錆を使用する方法を学びたいので、このプロジェクトを構築しています。
ffi
私の問題は、正しい型で関数を呼び出す方法がわからないことです。
var lib = ffi.Library('target/debug/libmain', {
'get_soup': ['Vec<Post>', ['String']]
});
'Vec<Post>'
動作しません。私はそのために使用しなければならないことを理解してref
います。しかし、それが実際にどのように、そして何をするのか、私にはよくわかりません。
さび型を JavaScript に変換する必要があることを理解していますか?
Vec<Post>
ffi 関数でどのように使用できますか?
そのための私のgithubプロジェクト: Realtin/suppe
そしてここに関連するコード:
さびコード:
extern crate rss;
extern crate hyper;
use rss::Rss;
use std::io::prelude::*;
#[derive(Debug)]
pub struct Post {
title: String,
link: String,
description: String,
}
fn main() {
let user = "realtin".to_string();
let vec = get_soup(&user);
println!("{:?}", vec[vec.len()-1]);
}
#[no_mangle]
pub extern fn get_soup(user: &str) ->Vec<Post>{
let url = format!("http://{}.soup.io/rss", user);
let mut vec = Vec::new();
let client = hyper::Client::new();
let mut response = client.get(&url).send().unwrap();
let mut suppe = String::new();
let _= response.read_to_string(&mut suppe);
let rss::Rss(channel) = suppe.parse::<rss::Rss>().unwrap();
for item in channel.items.into_iter().rev() {
let item_object = Post {
title: item.title.unwrap(),
link: item.link.unwrap(),
description: item.description.unwrap(),
};
vec.push(item_object);
}
return vec;
}
NodeJS コード:
var ref = require('ref');
var StructType = require("ref-struct");
var ffi = require('ffi');
var Post = StructType({
title: String,
link: String,
description: String,
});
// var vecPost = ref.refType(ref.types.Object);
var lib = ffi.Library('target/debug/libmain', {
'get_soup': ['Vec<Post>', ['String']]
});
var posts = lib.get_soup("realtin");