2017-12-27 28 views
0

tokio_core::net::UdpCodecを実装しようとしていますが、これはdns_parser::Packetをdns_parserクレートから作成しています。現在の実装では次のようになります。tokio_core :: net :: UdpCodec関連タイプの生涯

pub struct MdnsCodec; 

impl UdpCodec for MdnsCodec { 
    type In = dns_parser::Packet; 
    type Out = (SocketAddr, dns_parser::Builder); 

    fn decode(&mut self, addr: &SocketAddr, buf: &[u8]) -> io::Result<Self::In> { 
     Ok(dns_parser::Packet::parse(buf).unwrap()) 
    } 

    fn encode(&mut self, (addr, builder): Self::Out, into: &mut Vec<u8>) -> SocketAddr { 
     let packet_data = builder.build().unwrap(); 
     into.extend(&packet_data); 
     addr 
    } 
} 

dns_parser::Packetの定義は次のとおりです。

pub struct Packet<'a> { 
    pub header: Header, 
    pub questions: Vec<Question<'a>>, 
    pub answers: Vec<ResourceRecord<'a>>, 
    pub nameservers: Vec<ResourceRecord<'a>>, 
    pub additional: Vec<ResourceRecord<'a>>, 
    pub opt: Option<OptRecord<'a>>, 

}

これはとコンパイルに失敗します。

error[E0106]: missing lifetime specifier 
    --> src/main.rs:18:15 
    | 
18 |  type In = dns_parser::Packet; 
    |    ^^^^^^^^^^^^^^^^^^ expected lifetime parameter 

error: aborting due to previous error 

問題は、私ができることです生涯として何を追加するのか分かりません!私はパケットがbuf引数と同じ寿命を持つ必要があると仮定します。しかし、私はこれを自分自身で正しく表現する方法を理解することはできません。

私はgithubのに非稼働の例をアップロードしていますトリッキー一つだ https://github.com/Fulkerson/mdnsfuturestest

答えて

0

を。限り、これを動作させる唯一の方法を伝えるために唯一の方法は、夜間の錆(rustup toolchain install nightlyrustup default nightly)を使用し、夜間機能generic_associated_typesを使用することです。その理由は、関連付けられたタイプ(type Inなど)は、もともとジェネリックスであること、またはタイプ/ライフタイム引数を持つことが許可されていなかったからです。

#![feature(generic_associated_types)] 

// ...includes... 

pub struct MdnsCodec; 

impl UdpCodec for MdnsCodec { 
    type In<'a> = dns_parser::Packet<'a>; 
    // ...rest of impl... 
} 

fn main() { 
    // ...code... 
} 

はもちろん、あなたが使用するすべての不安定な特徴は、警告なしにいつでも変更される可能性があること例えば、プレリリースソフトウェアを使用すると発生する通常の問題があります。