18 releases (1 stable)

2.0.0-alpha.5 Sep 8, 2024
2.0.0-alpha.4 Jul 23, 2024
2.0.0-alpha.1 Jun 7, 2024
1.0.0 Aug 22, 2023
0.2.2 Feb 22, 2021

#193 in Parser implementations

Download history 212/week @ 2024-07-21 192/week @ 2024-07-28 135/week @ 2024-08-04 83/week @ 2024-08-11 196/week @ 2024-08-18 86/week @ 2024-08-25 92/week @ 2024-09-01 287/week @ 2024-09-08 238/week @ 2024-09-15 144/week @ 2024-09-22 110/week @ 2024-09-29 146/week @ 2024-10-06 119/week @ 2024-10-13 76/week @ 2024-10-20 75/week @ 2024-10-27 87/week @ 2024-11-03

373 downloads per month
Used in 5 crates (2 directly)

MIT/Apache

1MB
17K SLoC

imap-codec

%%{init: {'theme': 'neutral' } }%%
flowchart LR
    imap-types --> imap-codec
    imap-codec -.-> imap-next
    imap-next -.-> imap-proxy
    imap-next -.-> imap-client
    
    style imap-codec stroke-width:4px
    
    click imap-types href "https://github.com/duesee/imap-codec/tree/main/imap-types"
    click imap-codec href "https://github.com/duesee/imap-codec"
    click imap-next href "https://github.com/duesee/imap-next"
    click imap-proxy href "https://github.com/duesee/imap-proxy"
    click imap-client href "https://github.com/soywod/imap-client"

This library provides parsing and serialization for IMAP4rev1. It is based on imap-types and a rock-solid and well-documented building block for IMAP client and server implementations in Rust. The complete formal syntax of IMAP4rev1 and several IMAP extensions are implemented.

If you are looking for thin protocol handling, i.e., LITERAL handling, AUTHENTICATE, and IDLE, head over to imap-next.

Features

  • Parsing works in streaming mode. Incomplete is returned when there is insufficient data to make a final decision. No message will be truncated.
  • Parsing is zero-copy by default. Allocation is avoided during parsing, but all messages can explicitly be converted into more flexible owned variants.
  • Fuzzing and property-based tests exercise the library. The library is fuzz-tested never to produce a message it can't parse itself.

Usage

use imap_codec::{decode::Decoder, encode::Encoder, CommandCodec};

fn main() {
    let input = b"ABCD UID FETCH 1,2:* (BODY.PEEK[1.2.3.4.MIME]<42.1337>)\r\n";

    let codec = CommandCodec::new();
    let (remainder, command) = codec.decode(input).unwrap();
    println!("# Parsed\n\n{:#?}\n\n", command);

    let buffer = codec.encode(&command).dump();

    // Note: IMAP4rev1 may produce messages that are not valid UTF-8.
    println!("# Serialized\n\n{:?}", std::str::from_utf8(&buffer));
}

License

This crate is dual-licensed under Apache 2.0 and MIT terms.

Dependencies

~2.3–3.5MB
~67K SLoC