Estoy entrando en un error de tipo al intentar hacer lo siguiente:

use kuchiki::parse_html;
use kuchiki::traits::*;

fn main() {
    let data = r#"<!DOCTYPE html>
                  <html>
                      <body>
                          test
                      </body>
                  </html>"#;
    let dom = parse_html()
        .from_utf8()
        .from_iter(data.as_bytes());
}

El error es:

error[E0271]: type mismatch resolving `<tendril::fmt::Bytes as tendril::fmt::SliceFormat>::Slice == u8`
  --> src/main.rs:13:10
   |
13 |         .from_iter(data.as_bytes());
   |          ^^^^^^^^^ expected slice, found u8
   |
   = note: expected type `[u8]`
              found type `u8`
   = note: required because of the requirements on the impl of `std::convert::Into<tendril::tendril::Tendril<tendril::fmt::Bytes>>` for `&u8`

data.as_bytes() Devuelve una referencia a una rebanada de bytes (&[u8]), así que estoy confundido en cuanto a donde viene el found u8. ¿Cómo recto este error?

Los documentos para el método en la pregunta están aquí.

2
ocliwt 12 jul. 2019 a las 23:43

1 respuesta

La mejor respuesta

Use read_from() en lugar de from_iter(), como este:

use kuchiki::parse_html;
use kuchiki::traits::*;

fn main() {
    let data = r#"<!DOCTYPE html>
                  <html>
                      <body>
                          test
                      </body>
                  </html>"#;
    let dom = parse_html()
        .from_utf8()
        .read_from(&mut data.as_bytes());
}

Tienes el error de compilación porque from_iter() necesita un iterador con el tipo de elemento Tendril. Una tendril es un tipo de cadena, por lo que el tipo de data necesitaría ser algo como Vec<&[u8]>, pero tiene &[u8].

También puede hacer que funcione utilizando from_iter(), pero es un poco menos claro / eficiente:

use kuchiki::parse_html;
use kuchiki::traits::*;

fn main() {
    let data = r#"<!DOCTYPE html>
                  <html>
                      <body>
                          test
                      </body>
                  </html>"#;
    let dom = parse_html()
        .from_utf8()
        .from_iter(vec![data.as_bytes()]);
}
2
Szabolcs Berecz 12 jul. 2019 a las 23:00