fn parse_request()

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])
}