seq_geom_parser 0.3.0

A small crate for parsing library geometry specifications for single-cell sequencing.
Documentation
// hidden tokens
bopen = _{ "[" }
bclose = _{ "]" }
rsep = _{ "-" }
usep = _{ ":" }
dopen = _{ "{" }
dclose = _{ "}" }

read_num   =  { "1" | "2" }
single_len =  { ASCII_DIGIT+ }
len_range  =  ${ single_len ~ rsep ~ single_len }
nucstr     =  { ("A" | "C" | "G" | "T")+ }

fixed_barcode_segment = { "b" ~ bopen ~ single_len ~ bclose }
fixed_umi_segment     = { "u" ~ bopen ~ single_len ~ bclose }
fixed_seq_segment     = { "f" ~ bopen ~ nucstr ~ bclose }
fixed_read_segment    = { "r" ~ bopen ~ single_len ~ bclose }
fixed_discard_segment = { "x" ~ bopen ~ single_len ~ bclose }

ranged_barcode_segment = { "b" ~ bopen ~ len_range ~ bclose }
ranged_umi_segment     = { "u" ~ bopen ~ len_range ~ bclose }
ranged_read_segment    = { "r" ~ bopen ~ len_range ~ bclose }
ranged_discard_segment = { "x" ~ bopen ~ len_range ~ bclose }

unbounded_barcode_segment = { "b" ~ usep }
unbounded_umi_segment     = { "u" ~ usep }
unbounded_read_segment    = { "r" ~ usep }
unbounded_discard_segment = { "x" ~ usep }

fixed_segment = {
    (fixed_umi_segment | fixed_read_segment | fixed_barcode_segment | fixed_discard_segment)
}

ranged_segment = {
    (ranged_umi_segment | ranged_read_segment | ranged_barcode_segment | ranged_discard_segment)
}

bounded_segment = _{
    (fixed_segment | fixed_seq_segment | (ranged_segment ~ fixed_segment* ~ fixed_seq_segment) | (unbounded_segment ~ fixed_segment* ~ fixed_seq_segment))
}

unbounded_segment = {
    (unbounded_umi_segment | unbounded_read_segment | unbounded_barcode_segment | unbounded_discard_segment)
}

read_desc = {
    dopen ~ ((bounded_segment)+ ~ (ranged_segment | unbounded_segment)? | unbounded_segment | ranged_segment) ~ dclose
}

read_1_desc = { "1" ~ read_desc }

read_2_desc = { "2" ~ read_desc }

frag_desc = _{ SOI ~ read_1_desc ~ read_2_desc ~ EOI }