Rust возвращает результат из функции

Я новичок в использовании 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`.

Нет ли сообщений об ошибках? Если да, не могли бы вы показать их в своем вопросе, пожалуйста?

prog-fh 24.03.2024 09:44

добавил ошибку по запросу

Cyriel Lamerigts 24.03.2024 09:52

Сообщение об ошибке вполне понятно. Ошибка, указанная primary_key(), не может быть преобразована в String. В документации azure_data_cosmos мы видим пример, возвращающий azure_core::Result<()>. Можно попробовать azure_core::Result<String>.

prog-fh 24.03.2024 10:07
Почему Python в конце концов умрет
Почему Python в конце концов умрет
Последние 20 лет были действительно хорошими для Python. Он прошел путь от "просто языка сценариев" до основного языка, используемого для написания...
0
3
81
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ошибка вызвана типом возвращаемого значения, объявленным вами в функции: Result<String, String>. Этот тип указывает:

  • успешный результат — это String, и
  • ошибка тоже String.

Первое имеет смысл, поскольку тип переменной resultString, поэтому 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. Это то, что обычно происходит в более крупных проектах, где взаимодействуют несколько различных платформ: приложение должно иметь возможность распространять различные типы ошибок через результат, поэтому существует перечисление с вариантами для ошибок Azure, ошибок файловой системы и т. д. и т. п.

идеально, azure_core::Result<String> работает. Спасибо, это позволяет мне снова двигаться вперед!

Cyriel Lamerigts 24.03.2024 11:56

Другие вопросы по теме