in plasma-stream/src/client/cli.rs [54:91]
fn parse_request(line: String) -> Result<Vec<PeerRequest>, String> {
let tokens: Vec<&str> = line.split(' ').collect();
if tokens.len() < 3 {
return Err(String::from(
"invalid request; must be [COPY|TAKE] [server address] [object ID list]",
));
}
let req_type = tokens[0].to_string();
let address: SocketAddr = tokens[1]
.to_string()
.parse()
.map_err(|err| format!("server address {} is invalid: {}", tokens[1], err))?;
let mut object_ids = Vec::with_capacity(tokens.len() - 2);
for token in tokens.into_iter().skip(2) {
let id: ObjectId = hex::decode(token)
.map_err(|err| format!("object ID '{}' is invalid: {}", token, err))?
.try_into()
.map_err(|_| format!("object ID '{}' is invalid: must be 20 bytes long", token))?;
object_ids.push(id);
}
let peer_req = match req_type.as_str() {
"copy" | "COPY" => PeerRequest::Copy {
from: address,
objects: object_ids,
},
"take" | "TAKE" => PeerRequest::Take {
from: address,
objects: object_ids,
},
_ => return Err(String::from("requests must start with either COPY or TAKE")),
};
Ok(vec![peer_req])
}