use super::{EndState, Staged, StagedToken, Token, units_to_string};
const DELIMITER: u16 = b'/' as u16;
const DEFAULT_TYPE: &str = "word";
pub(super) fn tokenize(units: &[u16]) -> Staged {
let mut tokens: Vec<StagedToken> = Vec::new();
let mut read = 0usize;
let mut carried = 0usize;
let mut end_delimiter = false;
while read < units.len() || end_delimiter {
let mut length = if end_delimiter {
end_delimiter = false;
1
} else {
0
};
let mut added = length > 0;
while read < units.len() {
let unit = units[read];
read += 1;
if !added {
added = true;
length += 1;
} else if unit == DELIMITER {
end_delimiter = true;
break;
} else {
length += 1;
}
}
if !added {
break;
}
length += carried;
carried = length;
tokens.push(StagedToken {
token: Token {
term: units_to_string(&units[..length]),
position_increment: u32::from(tokens.is_empty()),
start_offset: 0,
end_offset: length as u32,
token_type: DEFAULT_TYPE.to_owned(),
},
stop: EndState {
position_increment: 0,
offset: read as u32,
},
});
}
Staged {
tokens,
end: EndState {
position_increment: 0,
offset: units.len() as u32,
},
}
}