简体   繁体   中英

How to solve this return type function error in Rust

I am creating a rust web application. I am new to this thing and I am trying to make API requests and pass a result form a request as Response to the web view. There are main.rs, route.rs and common.rs files. Basically main.rs file call relevant route and then route will call the function.

But, there is an error with a function in the route.rs file.

error[E0277]: the trait bound `fn() -> impl std::future::Future {<search::routes::get_token as actix_web::service::HttpServiceFactory>::register::get_token}: actix_web::handler::Factory<_, _, _>` is not satisfied
  --> src\search\routes.rs:20:10
   |
20 | async fn get_token() -> Result<String, reqwest::Error> {
   |          ^^^^^^^^^ the trait `actix_web::handler::Factory<_, _, _>` is not implemented for `fn() -> impl std::future::Future {<search::routes::get_token as actix_web::service::HttpServiceFactory>::register::get_token}`

How can I Fix this??

route.rs

use crate::search::User;
use actix_web::{get, post, put, delete, web, HttpResponse, Responder};
use serde_json::json;
extern crate reqwest;
extern crate serde;
mod bfm;
mod common;

#[get("/token")]
async fn get_token() -> Result<String, reqwest::Error> {

    let set_token = common::authenticate(); 
    // let set_token = common::get_rust_posts();
    return set_token.await;
    //HttpResponse::Ok().json(set_token)
}

common.rs

extern crate reqwest;
use reqwest::header::HeaderMap;
use reqwest::header::AUTHORIZATION;
use reqwest::header::CONTENT_TYPE;

pub async fn authenticate() -> Result<String, reqwest::Error> {

    fn construct_headers() -> HeaderMap {
        let mut headers = HeaderMap::new();

        headers.insert(AUTHORIZATION, "Basic bghythjuikyt==".parse().unwrap());
        headers.insert(CONTENT_TYPE, "application/x-www-form-urlencoded".parse().unwrap());

        assert!(headers.contains_key(AUTHORIZATION));
        assert!(!headers.contains_key(CONTENT_TYPE));

        headers
    }

    let client = reqwest::Client::new();

    let reszr = client.post("https://api.test.com/auth/token")
    .headers(construct_headers())
    .body("grant_type=client_credentials")
        .send()
        .await?
        .text()
        .await;

        return reszr;
}

First of all, please read: https://actix.rs/docs/errors/

--

Do you have implemented ResponseError for reqwest::Error ?

You have to implement ResponseError trait because framework have to response with something in case when Result is Err .

Here is an example

impl ResponseError for Error {
    fn error_response(&self) -> HttpResponse {
        match self.kind_ref() {
            ErrorKind::HttpResponse { msg, code, real } => {
                println!("{}", real);

                HttpResponse::build(code.to_owned()).json(json!({
                    "status": false,
                    "msg": msg
                }))
            }
            _ => {
                println!("{}", self);

                HttpResponse::build(StatusCode::INTERNAL_SERVER_ERROR).finish()
            }
        }
    }
}

Error in this case is my custom error that contains msg , code , real , but the logic should be similar in your case.

--

UPDATE: after @Masklinn comment about error[E0117]: only traits defined in the current crate can be implemented for arbitrary types

Code above works only on custom Error you own.

What you can to do is:

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM