Continue working on RaiseTo trait

CandyCorvid
Jul 14, 2023, 1:58 PM
WIZUYIA53JTFD6RXK3VMTSC654QIKRLZZYYEPN2I3TFVGY3FPQ3AC

Dependencies

  • [2] W6L422WP WIP implement tofu
  • [3] EKHEIJTI Continue using thiserror
  • [4] 2C4IMVXF Begin implementing RaiseTo trait
  • [5] 3VVQWLOX Major refactor: modularisation
  • [6] 3SPNKI46 Improve parsing. Add modules that were missed
  • [7] ONQEIR5B WIP mime-type handling
  • [8] WGRFJRTE Add tests, rename Status to Header, implement redirect and proper input handling
  • [9] H7P2HPKX WIP use thiserror

Change contents

  • edit in src/response.rs at line 21
    [5.2086][5.0:26]()
    use thiserror::Error;
  • replacement in src/response.rs at line 34
    [5.2379][3.39:72]()
    let prompt = meta.0;
    [5.2379]
    [5.2444]
    let prompt = super::Meta::try_from(meta).unwrap().0;
  • replacement in src/response.rs at line 47
    [5.192][5.192:236](),[5.236][3.73:112](),[3.112][5.268:418](),[5.268][5.268:418]()
    impl TryFrom<(u8, Meta)> for Success {
    type Error = super::MimeError;
    fn try_from((_, meta): (u8, Meta)) -> Result<Self, Self::Error> {
    let mime = Mime::try_from(meta)?;
    Ok(Self { mime })
    [5.2740]
    [5.2955]
    impl From<(u8, Meta)> for Success {
    fn from((_, meta): (u8, Meta)) -> Self {
    let mime = Mime::try_from(Meta::try_from(meta).unwrap()).expect("failed to read mime");
    Self { mime }
  • replacement in src/response.rs at line 58
    [5.3098][3.113:385]()
    #[derive(Error, Debug)]
    #[error("failed to read mime: {0}")]
    pub struct UrlError(#[from] url::ParseError);
    impl TryFrom<(u8, Meta)> for Redirect {
    type Error = UrlError;
    fn try_from((code, meta): (u8, Meta)) -> Result<Self, Self::Error> {
    [5.3098]
    [5.3191]
    impl From<(u8, Meta)> for Redirect {
    fn from((code, meta): (u8, Meta)) -> Self {
  • replacement in src/response.rs at line 65
    [5.3341][3.386:446]()
    Ok(Self {
    url: meta.0.parse()?,
    [5.3341]
    [5.3423]
    Self {
    url: meta.0.parse().expect("not a valid url"),
  • replacement in src/response.rs at line 68
    [5.3450][3.447:462]()
    })
    [5.3450]
    [5.3464]
    }
  • edit in src/response.rs at line 142
    [5.5530][5.5530:5532](),[5.5532][5.419:533](),[5.533][3.463:567]()
    }
    #[derive(Error, Debug)]
    pub enum HeaderError {
    #[error("bad status code: [{0},{1}]")]
    BadStatus(u8, u8),
    #[error("{0}")]
    Mime(#[from] MimeError),
    #[error("{0}")]
    Url(#[from] header::UrlError),
  • replacement in src/response.rs at line 144
    [5.58][5.536:566]()
    type Error = HeaderError;
    [5.58]
    [5.5596]
    type Error = String;
  • replacement in src/response.rs at line 149
    [5.5750][5.567:590]()
    match status {
    [5.5750]
    [3.568]
    match match status {
  • replacement in src/response.rs at line 151
    [3.626][5.653:784](),[5.653][5.653:784]()
    2 => Some(Header::Success((sub, meta).try_into()?)),
    3 => Some(Header::Redirect((sub, meta).try_into()?)),
    [3.626]
    [3.627]
    2 => Some(Header::Success((sub, meta).into())),
    3 => Some(Header::Redirect((sub, meta).into())),
  • edit in src/response.rs at line 157
    [5.6168]
    [5.6277]
    } {
    Some(s) => Ok(s),
    None => Err(format!("bad status code: [{:?},{:?}]", status, sub)),
  • edit in src/response.rs at line 161
    [5.6287][5.987:1039]()
    .ok_or(HeaderError::BadStatus(status, sub))
  • edit in src/response.rs at line 164
    [5.20][5.1040:1062]()
    use thiserror::Error;
  • replacement in src/response.rs at line 167
    [5.6473][3.815:1074]()
    #[derive(Error, Debug)]
    #[error("reading MIME type: {0}")]
    pub struct MimeError(#[from] mime::FromStrError);
    impl TryFrom<Meta> for Mime {
    type Error = MimeError;
    fn try_from(value: Meta) -> Result<Self, Self::Error> {
    Ok(value.0.parse()?)
    [5.6473]
    [5.6822]
    impl From<Meta> for Mime {
    fn from(value: Meta) -> Self {
    value.0.parse().unwrap()
  • replacement in src/media.rs at line 5
    [4.126][4.126:258]()
    trait RaiseTo {
    type Target;
    type Output<'a>;
    fn raise_to<'a>(&self, target: &'a mut Self::Target) -> Self::Output<'a>;
    [4.126]
    [4.258]
    trait RaiseTo<Target> {
    type Output<'a>
    where
    Target: 'a;
    fn raise_to<'a>(&self, target: &'a mut Target) -> Self::Output<'a>;
  • replacement in src/media.rs at line 17
    [4.264][4.264:324]()
    impl<'a> RaiseTo for Media<'a> {
    type Target = String;
    [4.264]
    [4.324]
    impl RaiseTo<String> for Media<'_> {
  • replacement in src/media.rs at line 20
    [4.358][4.358:437]()
    fn raise_to<'a>(&self, target: &'a mut Self::Target) -> Self::Output<'a> {
    [4.358]
    [4.437]
    fn raise_to<'a>(&self, target: &'a mut String) -> Self::Output<'a> {
  • replacement in src/media.rs at line 22
    [4.458][4.458:557]()
    Media::Gemini(gem) => todo!(),
    Media::Text(text) => text.raise_to(target),
    [4.458]
    [4.557]
    Media::Gemini(gem) => Media::Gemini(gem.raise_to(target)),
    Media::Text(text) => Media::Text(text.raise_to(target)),
  • edit in src/media.rs at line 32
    [5.214]
    [5.901]
    }
    impl RaiseTo<String> for Gemini<'_> {
    type Output<'a> = Gemini<'a>;
    fn raise_to<'a>(&self, target: &'a mut String) -> Self::Output<'a> {
    Self {
    lines: self.lines.iter().map(|ln| ln.raise_to(target)).collect(),
    }
    }
  • replacement in src/media.rs at line 47
    [5.217][5.217:241]()
    #[derive(Clone, Debug)]
    [5.217]
    [5.241]
    #[derive(Copy, Clone, Debug)]
  • edit in src/media.rs at line 67
    [5.1313]
    [5.1313]
    }
    impl RaiseTo<String> for Line<'_> {
    type Output<'a> = Line<'a>;
    fn raise_to<'a>(&self, target: &'a mut String) -> Self::Output<'a> {
    match self {
    Line::Heading { level, title } => Line::Heading {
    level: *level,
    title: title.raise_to(target),
    },
    Line::Link { url, description } => {
    let url = url.raise_to(target);
    let description = description.map(|d| d.raise_to(target));
    Line::Link { url, description }
    }
    Line::Text(t) => Line::Text(t.raise_to(target)),
    Line::Preformatted(p) => Line::Preformatted(p.raise_to(target)),
    Line::ListItem(li) => Line::ListItem(li.raise_to(target)),
    Line::Quote(q) => Line::Quote(q.raise_to(target)),
    }
    }
  • edit in src/media.rs at line 93
    [5.393]
    [5.1419]
    }
    impl RaiseTo<String> for Preformat<'_> {
    type Output<'a> = Preformat<'a>;
    fn raise_to<'a>(&self, target: &'a mut String) -> Self::Output<'a> {
    let alt = self.alt.raise_to(target);
    let lines = self.lines.iter().map(|ln| ln.raise_to(target)).collect();
    Self { alt, lines }
    }
  • replacement in src/media.rs at line 242
    [5.896][4.576:640]()
    impl<'tl> RaiseTo for TextLine<'tl> {
    type Target = String;
    [5.896]
    [4.640]
    impl RaiseTo<String> for TextLine<'_> {
  • replacement in src/media.rs at line 252
    [4.865][4.865:924]()
    impl<'st> RaiseTo for &'st str {
    type Target = String;
    [4.865]
    [4.924]
    impl RaiseTo<String> for &'_ str {
  • edit in src/danger.rs at line 5
    [5.9993]
    [5.10019]
    // unconditionally trusts
  • edit in src/danger.rs at line 7
    [5.10038][2.0:44]()
    /// Unconditionally trusts all certificates
  • replacement in src/danger.rs at line 8
    [5.10056][2.45:46]()
    [5.10056]
    [5.10097]
    // trust on first use
    pub struct Tofu {}
  • edit in src/danger.rs at line 23
    [5.10449][2.47:768]()
    /// Trust on first use
    pub struct Tofu {
    known_hosts: Vec<TofuHost>,
    }
    pub struct TofuHost {}
    /*
    impl rustls::client::ServerCertVerifier for Tofu {
    fn verify_server_cert(
    &self,
    end_entity: &Certificate,
    _: &[Certificate],
    server_name: &ServerName,
    scts: &mut dyn Iterator<Item = &[u8]>,
    ocsp_response: &[u8],
    now: SystemTime,
    ) -> Result<ServerCertVerified, Error> {
    let host: TofuHost = TofuHost::new();
    if self.knows(host) {
    if self.trusts(host) {
    Ok(())
    } else {
    Err(())
    }
    } else {
    self.remember(host);
    Ok(())
    }
    }
    }
    */