Я новичок в использовании Rust. Я пытаюсь поиграться с Rust, Actix и Azure Cosmosdb. На данный момент я просто пытаюсь подключиться к космосдб и возвращаю результат. Я нахожусь в той точке, когда я вообще доволен любым результатом. На данный момент у меня есть код в функции, которая должна просто возвращать строку с именем коллекции космоса. Не могу уложить в голове, как в результате вернуть строку. Мне нужно вернуть результат, поскольку это асинхронная функция. Если кто-то может указать мне правильный путь, я был бы очень благодарен. код космоса исходит от azure_data_cosmos::prelude::*
; Код ниже:
async fn datastuff() -> Result<String, String> {
let primary_key = std::env::var("COSMOSDB_READKEY").expect("Set env variable COSMOS_PRIMARY_KEY first!");
let account = std::env::var("COSMOSDB_ACCOUNT").expect("Set env variable COSMOS_ACCOUNT first!");
let database_name = "azdeployer";
let collection_name = "resourcetemplates";
// First, create an authorization token. There are two types of tokens: primary and resource constrained.
// Please check the Azure documentation or the examples folder on how to create and use token-based permissions.
let authorization_token = AuthorizationToken::primary_key(&primary_key)?;
// Next we will create a Cosmos client.
let client = CosmosClient::new(account, authorization_token);
// We know the database so we can obtain a database client.
let database = client.database_client(database_name);
// We know the collection so we can obtain a collection client.
let collection = database.collection_client(collection_name);
//let cosmos_collection_client: CollectionClient = cosmos::cosmosclient::create_collection_client().expect("prutser");
//let document_client: DocumentClient = cosmos_collection_client.document_client("resourceGroups@2022-09-01", "resourcegroup");
let documents1 = collection.list_documents();
let documents = collection.collection_name();
let result: String = documents.to_string();
Ok(result)
Ошибка, которую я получаю:
error[E0277]: `?` couldn't convert the error
to `std::string::String` --> src\main.rs:17:76 | 17 | let
authorization_token = AuthorizationToken::primary_key(&primary_key)?;
|
^ the trait `std::convert::From<azure_core::error::Error>` is not
implemented for `std::string::String` | = note: the question
mark operation (`?`) implicitly performs a conversion on the error
value using the `From` trait = help: the following other types
implement trait `std::convert::From<T>`:
<std::string::String as std::convert::From<char>>
<std::string::String as std::convert::From<bytestring::ByteString>>
<std::string::String as std::convert::From<Box<str>>>
<std::string::String as std::convert::From<uuid::Uuid>>
<std::string::String as std::convert::From<Cow<'a, str>>>
<std::string::String as std::convert::From<url::Url>>
<std::string::String as std::convert::From<&str>>
<std::string::String as std::convert::From<&mut str>>
<std::string::String as std::convert::From<&std::string::String>> = note: required for
`Result<std::string::String, std::string::String>` to implement
`FromResidual<Result<Infallible, azure_core::error::Error>>`
Some errors have detailed explanations: E0277, E0425. For more
information about an error, try `rustc --explain E0277`.
добавил ошибку по запросу
Сообщение об ошибке вполне понятно. Ошибка, указанная primary_key()
, не может быть преобразована в String
. В документации azure_data_cosmos
мы видим пример, возвращающий azure_core::Result<()>
. Можно попробовать azure_core::Result<String>
.
Ошибка вызвана типом возвращаемого значения, объявленным вами в функции: Result<String, String>
. Этот тип указывает:
String
, иString
.Первое имеет смысл, поскольку тип переменной result
— String
, поэтому Ok(result)
соответствует объявленному типу возвращаемого значения. Однако компилятор жалуется на строку:
let authorization_token = AuthorizationToken::primary_key(&primary_key)?;
? Оператор — это синтаксический сахар для проверки неудачной операции и, если да, немедленного возврата Err
из текущей функции с этой ошибкой. Для удобства он также попытается преобразовать ошибку на основе реализации From.
Эта последняя часть не работает, как заметил компилятор:
the trait `std::convert::From<azure_core::error::Error>` is not
implemented for `std::string::String`
То есть метод Primary_key возвращает azure_core::Result<AuthorizationToken>, который является псевдонимом типа Result<AuthorizationToken, azure_core::error::Error>
, но azure_core::error::Error
нельзя преобразовать в String
.
Возможные решения:
azure_core::Result<String>
. Таким образом, оператор ?
будет работать, поскольку тип ошибки уже соответствует. Однако ваш интерфейс изменится, поэтому сайт вызова также необходимо будет адаптировать.?
. В целом это плохо, так как вы вносите в программу потенциальный источник паники (сбоев), но это самое быстрое изменение, если вы пытаетесь просто что-то прототипировать.идеально, azure_core::Result<String> работает. Спасибо, это позволяет мне снова двигаться вперед!
Нет ли сообщений об ошибках? Если да, не могли бы вы показать их в своем вопросе, пожалуйста?