У меня есть определенные типы, а затем я сохраняю их в переменных типа ArrayVec<[MyType, 16]>
(из arrayvec
ящик) (членов структуры). Restson имеет черту RestPath
, что позволяет нам определять путь, используемый для формирования URI при выполнении запроса REST.
Однако из-за ограничения, котороедля произвольных типов могут быть реализованы только локальные черты (AKA - сиротское правило). Я не могу использовать это прямо для ArrayVec<[MyType, 16]>
.
. Я как-то преодолел эту проблему, реализовав черту для ~ специализации ~ реализации следующихenum:
enum ModelArray<T> {
Array(T)
}
, а затем decorticate экземпляр T
, используя:
type MyArray = ModelArray<ArrayVec<[MyType; 16]>>;
let encapsulated_array: MyArray = client.get(()).unwrap();
let ModelArray::<ArrayVec<[MyType; 16]>>::Array(myarray) = encapsulated_array;
Это работает как минимальный пример, но я страдаю от того факта, что яЯ не могу вызвать client.get(()).unwrap()
напрямую члену другой структуры.
Я удивлен, что полная специализация универсального типа не обрабатывается Rust, поскольку локальный тип и правило-сирота все еще применяются.Почему?
Существуют ли другие приятные способы преодоления ограничения, и я позволил бы мне аккуратно назначить результат get()
Restson на элементы структуры?
Рабочий код:
extern crate restson;
extern crate arrayvec;
extern crate serde_derive;
use restson::RestPath;
use arrayvec::ArrayVec;
#[derive(Deserialize, Debug)]
struct MyType {
id: u16,
data: u32,
}
struct DataModel {
my_data: ArrayVec<[MyType; 16]>
}
#[derive(Deserialize, Debug)]
#[serde(untagged)]
enum ModelArray<T> {
Array(T)
}
impl RestPath<u16> for MyType {
fn get_path(id: u16) -> Result<String, Error> {
Ok(format!("data/MyType/{}", id))
}
}
impl RestPath<()> for ModelArray<ArrayVec<[MyType; 16]>> {
fn get_path(_: ()) -> Result<String, Error> {
Ok(String::from("data/MyType"))
}
}
use restson::RestClient;
pub fn load_data() {
let mut client = RestClient::new(&format!("http://{}", "localhost:8080")).unwrap();
let element: Type = client.get(24).unwrap();
println!("Room: {:?}", elementh);
type ModelArray = ModelArray<ArrayVec<[MyType; 16]>>;
let encapsulated: ModelArray = client.get(()).unwrap();
let ModelArray::<ArrayVec<[MyType; 16]>>::Array(elements) = encapsulated;
println!("Room: {:?}", elements[0]);
}
На Rust Playground (отсутствие restson
ящика не позволило бы вам построить)
Соответствующий полный код: на GitHubGist