Open
Description
Each API models the API url parts as an enum, and where an API has more than one enum variant, the API function on the root/namespace client takes the enum as an argument. For example, for search
let response = client
.search(SearchUrlParts::Index(&["index-1"])) // <-- accepts enum
.send()
.await?;
Currently, the Rust compiler cannot infer the enum type based on the parameter, meaning the complete enum path needs to be specified as above, instead of simply the following pseudo
let response = client
.search(Index(&["index-1"]))
.send()
.await?;
To make the API somewhat simpler to use, it is proposed to implement From<T>
traits for each enum such that a value, or tuple of values, can be used. Taking the example above
impl<'a> From<&'a [&'a str]> for SearchUrlParts<'a> {
fn from(index: &'a [&'a str]) -> Self {
SearchUrlParts::Index(index)
}
}
impl<'a> From<(&'a [&'a str], &'a [&'a str])> for SearchUrlParts<'a> {
fn from(index_type: (&'a [&'a str], &'a [&'a str])) -> Self {
SearchUrlParts::IndexType(index_type.0, index_type.1)
}
}
let response = client
.search(&["posts"].into())
.send()
.await?;