9

私は自分の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");
4

2 に答える 2

10

簡単な答え: FFI バインディング用の Rust 関数をエクスポートすることはできません。C と互換性のある Rust 関数を具体的にエクスポートする必要があります。

具体的には、これは、C 構造体と互換性のあるオブジェクトのみを公開するか、不透明なポインター (Rust 関数を介してのみ操作できる) を公開する必要があることを意味します。

あなたの場合、でVec<Post>はないため、FFIでの使用と互換性がVecありません。

詳細については、FFI ガイドを参照してください。

于 2015-08-20T14:01:13.720 に答える