├── migrations ├── .gitkeep └── 2020-03-28-185431_create_thermostat_status │ ├── down.sql │ └── up.sql ├── .dockerignore ├── .gitignore ├── src ├── handlers │ ├── mod.rs │ └── graphql.rs ├── models │ ├── mod.rs │ ├── key.rs │ ├── errors.rs │ └── thermostat_status.rs ├── schema.rs ├── lib.rs ├── db.rs ├── schema_graphql.rs └── main.rs ├── tests ├── common │ ├── mod.rs │ ├── helpers.rs │ └── app.rs ├── test_set_thermostat_status.rs ├── test_key.rs ├── test_thermostat_status.rs └── test_thermostat_status_history.rs ├── codecov.yml ├── diesel.toml ├── .env ├── Dockerfile ├── Cargo.toml ├── .github └── workflows │ ├── security-audit.yml │ └── ci.yml ├── docker-compose.yaml ├── Makefile.toml ├── LICENSE ├── README.md └── Cargo.lock /migrations/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.dockerignore: -------------------------------------------------------------------------------- 1 | target 2 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | target 2 | .vscode 3 | -------------------------------------------------------------------------------- /src/handlers/mod.rs: -------------------------------------------------------------------------------- 1 | pub mod graphql; 2 | -------------------------------------------------------------------------------- /tests/common/mod.rs: -------------------------------------------------------------------------------- 1 | pub mod app; 2 | pub mod helpers; 3 | -------------------------------------------------------------------------------- /codecov.yml: -------------------------------------------------------------------------------- 1 | coverage: 2 | status: 3 | project: off 4 | patch: off 5 | -------------------------------------------------------------------------------- /src/models/mod.rs: -------------------------------------------------------------------------------- 1 | pub mod errors; 2 | pub mod key; 3 | pub mod thermostat_status; 4 | -------------------------------------------------------------------------------- /migrations/2020-03-28-185431_create_thermostat_status/down.sql: -------------------------------------------------------------------------------- 1 | DROP TABLE thermostat_status; 2 | -------------------------------------------------------------------------------- /src/schema.rs: -------------------------------------------------------------------------------- 1 | table! { 2 | thermostat_status (id) { 3 | id -> Int4, 4 | status -> Bool, 5 | timestamp -> Timestamp, 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /diesel.toml: -------------------------------------------------------------------------------- 1 | # For documentation on how to configure this file, 2 | # see diesel.rs/guides/configuring-diesel-cli 3 | 4 | [print_schema] 5 | file = "src/schema.rs" 6 | -------------------------------------------------------------------------------- /src/models/key.rs: -------------------------------------------------------------------------------- 1 | #[derive(Clone)] 2 | pub struct Key { 3 | pub value: String, 4 | } 5 | 6 | impl Key { 7 | pub fn new(value: String) -> Key { 8 | Key { value } 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /src/lib.rs: -------------------------------------------------------------------------------- 1 | extern crate dotenv; 2 | #[macro_use] 3 | extern crate diesel; 4 | #[macro_use] 5 | extern crate serde; 6 | 7 | pub mod db; 8 | pub mod handlers; 9 | pub mod models; 10 | pub mod schema; 11 | pub mod schema_graphql; 12 | -------------------------------------------------------------------------------- /.env: -------------------------------------------------------------------------------- 1 | # dev only 2 | HOST=localhost 3 | POSTGRES_DB_HOST=localhost 4 | 5 | # dev and docker 6 | PORT=8080 7 | POSTGRES_DB=rust_graphql_example 8 | POSTGRES_DB_TEST=rust_graphql_example_test 9 | POSTGRES_USER=postgres 10 | POSTGRES_PASSWORD=password 11 | API_KEY=123 12 | -------------------------------------------------------------------------------- /migrations/2020-03-28-185431_create_thermostat_status/up.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE thermostat_status ( 2 | id SERIAL PRIMARY KEY, 3 | status BOOLEAN NOT NULL, 4 | timestamp TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP 5 | ); 6 | INSERT INTO thermostat_status(status) 7 | VALUES 8 | (false); 9 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM rust:slim-buster 2 | 3 | RUN apt-get update && \ 4 | apt-get -y upgrade && \ 5 | apt-get -y install libpq-dev 6 | 7 | WORKDIR /app 8 | COPY ["Cargo.toml", "Cargo.lock", "diesel.toml", "/app/"] 9 | COPY migrations /app/migrations 10 | COPY src /app/src 11 | 12 | RUN cargo build --release 13 | 14 | EXPOSE 8080 15 | 16 | ENTRYPOINT ["/bin/bash", "-c", "cargo run --release"] 17 | -------------------------------------------------------------------------------- /src/models/errors.rs: -------------------------------------------------------------------------------- 1 | #[derive(Debug, Clone, Serialize, Deserialize)] 2 | pub struct GraphQlErrorLocation { 3 | pub line: i32, 4 | pub column: i32, 5 | } 6 | 7 | #[derive(Debug, Clone, Serialize, Deserialize)] 8 | pub struct GraphQLError { 9 | pub message: String, 10 | pub locations: Vec, 11 | } 12 | 13 | #[derive(Debug, Clone, Serialize, Deserialize)] 14 | pub struct GraphQLErrors { 15 | pub errors: Vec, 16 | } 17 | 18 | impl GraphQLErrors { 19 | pub fn new(message: &str) -> GraphQLErrors { 20 | GraphQLErrors { 21 | errors: vec![GraphQLError { 22 | message: message.to_owned(), 23 | locations: Vec::new(), 24 | }], 25 | } 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "rust-graphql-actix-juniper-diesel-example" 3 | version = "0.2.0" 4 | authors = ["Mihai Dinculescu "] 5 | edition = "2018" 6 | 7 | [lib] 8 | name = "lib" 9 | path = "src/lib.rs" 10 | 11 | [dependencies] 12 | # misc 13 | futures = "0.3.12" 14 | dotenv = "0.15.0" 15 | chrono = { version = "0.4.19", features = ["serde"] } 16 | 17 | # web server 18 | actix-web = "3.3.2" 19 | actix-rt = "1.1.1" 20 | actix-cors = "0.5.4" 21 | env_logger = "0.8.2" 22 | 23 | # database 24 | diesel = { version = "1.4.5", features = ["postgres", "r2d2", "chrono"] } 25 | diesel_migrations = "1.4.0" 26 | 27 | # graphql 28 | juniper = "0.15.3" 29 | serde = "1.0.123" 30 | serde_derive = "1.0.123" 31 | serde_json = "1.0.61" 32 | 33 | [dev-dependencies] 34 | actix-http = "2.2.0" 35 | serial_test = "*" 36 | -------------------------------------------------------------------------------- /tests/common/helpers.rs: -------------------------------------------------------------------------------- 1 | use actix_http::error::Error; 2 | use actix_http::Request; 3 | use actix_web::dev::Service; 4 | use actix_web::dev::ServiceResponse; 5 | use actix_web::test; 6 | 7 | #[allow(dead_code)] // not all integration tests use this 8 | pub async fn set_thermostat_status(app: &mut S, new_status: bool) 9 | where 10 | S: Service, 11 | { 12 | let payload = format!( 13 | r#"{{"query": "mutation{{setThermostatStatus(data:{{status:{new_status}}}){{id,status,timestamp}}}}"}}"#, 14 | new_status = new_status 15 | ); 16 | 17 | let req = test::TestRequest::post() 18 | .uri("/graphql") 19 | .header("key", "123") 20 | .header("content-type", "application/json") 21 | .set_payload(payload) 22 | .to_request(); 23 | 24 | test::read_response(app, req).await; 25 | } 26 | -------------------------------------------------------------------------------- /.github/workflows/security-audit.yml: -------------------------------------------------------------------------------- 1 | name: Security 2 | on: 3 | push: 4 | branches: 5 | - master 6 | paths: 7 | - "**/Cargo.toml" 8 | - "**/Cargo.lock" 9 | pull_request: 10 | branches: 11 | - master 12 | paths: 13 | - "**/Cargo.toml" 14 | - "**/Cargo.lock" 15 | schedule: 16 | - cron: "0 0 * * *" 17 | jobs: 18 | security_audit: 19 | name: Audit 20 | runs-on: ubuntu-latest 21 | 22 | steps: 23 | - uses: actions/checkout@v2 24 | - name: Install latest nightly 25 | uses: actions-rs/toolchain@v1 26 | with: 27 | toolchain: nightly 28 | override: true 29 | - name: Install cargo-audit binary crate 30 | uses: actions-rs/install@v0.1 31 | with: 32 | crate: cargo-audit 33 | version: latest 34 | - uses: actions-rs/audit-check@v1 35 | with: 36 | token: ${{ secrets.GITHUB_TOKEN }} 37 | -------------------------------------------------------------------------------- /docker-compose.yaml: -------------------------------------------------------------------------------- 1 | version: "3.7" 2 | 3 | services: 4 | server: 5 | build: . 6 | container_name: rust-graphql-example-server 7 | depends_on: 8 | - storage 9 | environment: 10 | - HOST=0.0.0.0 11 | - PORT=80 12 | - POSTGRES_DB_HOST=storage 13 | - POSTGRES_DB=${POSTGRES_DB} 14 | - POSTGRES_USER=${POSTGRES_USER} 15 | - POSTGRES_PASSWORD=${POSTGRES_PASSWORD} 16 | - API_KEY=${API_KEY} 17 | ports: 18 | - ${PORT}:80 19 | storage: 20 | image: postgres:12.2 21 | container_name: rust-graphql-example-storage 22 | environment: 23 | - POSTGRES_DB=${POSTGRES_DB} 24 | - POSTGRES_USER=${POSTGRES_USER} 25 | - POSTGRES_PASSWORD=${POSTGRES_PASSWORD} 26 | volumes: 27 | - storage-postgresql:/var/lib/postgresql/data 28 | 29 | volumes: 30 | storage-postgresql: 31 | external: 32 | name: rust-graphql-example-storage 33 | -------------------------------------------------------------------------------- /Makefile.toml: -------------------------------------------------------------------------------- 1 | [env] 2 | CARGO_MAKE_EXTEND_WORKSPACE_MAKEFILE = "true" 3 | 4 | [config] 5 | skip_core_tasks = true 6 | 7 | [tasks.run] 8 | command = "cargo" 9 | args = ["run"] 10 | 11 | [tasks.watch] 12 | command = "cargo" 13 | args = ["watch", "-x", "run"] 14 | 15 | [tasks.coverage] 16 | command = "cargo" 17 | args = ["tarpaulin", "--verbose", "--all-features", "--ignore-tests", "--timeout", "120", "--out", "Xml"] 18 | 19 | [tasks.ci-flow] 20 | dependencies = [ 21 | "format", 22 | "check", 23 | "clippy", 24 | "test" 25 | ] 26 | 27 | [tasks.format] 28 | command = "cargo" 29 | args = ["fmt", "--verbose", "--", "--check"] 30 | 31 | [tasks.check] 32 | command = "cargo" 33 | args = ["check", "--verbose"] 34 | 35 | [tasks.clippy] 36 | command = "cargo" 37 | args = ["clippy", "--all-targets", "--all-features", "--verbose", "--", "-D", "warnings"] 38 | 39 | [tasks.test] 40 | command = "cargo" 41 | args = ["test", "--verbose"] 42 | 43 | [tasks.audit] 44 | command = "cargo" 45 | args = ["audit"] 46 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 Mihai Dinculescu. 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /src/db.rs: -------------------------------------------------------------------------------- 1 | use diesel::pg::PgConnection; 2 | use diesel::r2d2::{ConnectionManager, Pool, PoolError, PooledConnection}; 3 | use dotenv::dotenv; 4 | use std::env; 5 | 6 | pub type DbPool = Pool>; 7 | pub type DbPooledConnection = PooledConnection>; 8 | 9 | pub enum DatabaseKind { 10 | Example, 11 | ExampleTest, 12 | } 13 | 14 | fn init_pool(database_url: &str) -> Result { 15 | let manager = ConnectionManager::::new(database_url); 16 | Pool::builder().build(manager) 17 | } 18 | 19 | pub fn establish_connection(db_kind: DatabaseKind) -> DbPool { 20 | dotenv().ok(); 21 | 22 | let postgres_db_host = env::var("POSTGRES_DB_HOST").expect("POSTGRES_DB_HOST must be set"); 23 | 24 | let postgres_db = match db_kind { 25 | DatabaseKind::Example => env::var("POSTGRES_DB").expect("POSTGRES_DB must be set"), 26 | _ => env::var("POSTGRES_DB_TEST").expect("POSTGRES_DB_TEST must be set"), 27 | }; 28 | 29 | let postgres_user = env::var("POSTGRES_USER").expect("POSTGRES_USER must be set"); 30 | let postgres_password = env::var("POSTGRES_PASSWORD").expect("POSTGRES_PASSWORD must be set"); 31 | 32 | let database_url = format!( 33 | "postgres://{}:{}@{}/{}", 34 | postgres_user, postgres_password, postgres_db_host, postgres_db 35 | ); 36 | 37 | init_pool(&database_url).unwrap_or_else(|_| panic!("Error connecting to {}", database_url)) 38 | } 39 | -------------------------------------------------------------------------------- /src/models/thermostat_status.rs: -------------------------------------------------------------------------------- 1 | use chrono::NaiveDateTime; 2 | use juniper::{GraphQLInputObject, GraphQLObject}; 3 | 4 | use diesel::prelude::*; 5 | 6 | use crate::schema::thermostat_status; 7 | 8 | #[derive(GraphQLObject, Queryable, Clone)] 9 | #[graphql(description = "Thermostat status")] 10 | pub struct ThermostatStatus { 11 | id: i32, 12 | status: bool, 13 | timestamp: NaiveDateTime, 14 | } 15 | 16 | #[derive(GraphQLInputObject, Insertable)] 17 | #[table_name = "thermostat_status"] 18 | #[graphql(description = "New thermostat status")] 19 | pub struct NewThermostatStatus { 20 | status: bool, 21 | } 22 | 23 | impl ThermostatStatus { 24 | pub fn get_latest(connection: &PgConnection) -> QueryResult { 25 | use crate::schema::thermostat_status::dsl::*; 26 | 27 | thermostat_status 28 | .order(timestamp.desc()) 29 | .limit(1) 30 | .get_result(connection) 31 | } 32 | 33 | pub fn get_history(connection: &PgConnection) -> QueryResult> { 34 | use crate::schema::thermostat_status::dsl::*; 35 | 36 | thermostat_status 37 | .order(timestamp.desc()) 38 | .limit(20) 39 | .load::(connection) 40 | } 41 | 42 | pub fn insert(connection: &PgConnection, data: NewThermostatStatus) -> QueryResult { 43 | diesel::insert_into(thermostat_status::table) 44 | .values(&data) 45 | .execute(connection) 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /.github/workflows/ci.yml: -------------------------------------------------------------------------------- 1 | name: CI 2 | 3 | on: 4 | push: 5 | branches: 6 | - master 7 | pull_request: 8 | branches: 9 | - master 10 | 11 | jobs: 12 | checks: 13 | name: Rust checks 14 | runs-on: ubuntu-latest 15 | 16 | services: 17 | postgres: 18 | image: postgres:latest 19 | env: 20 | POSTGRES_DB: rust_graphql_example_test 21 | POSTGRES_USER: postgres 22 | POSTGRES_PASSWORD: password 23 | ports: 24 | - 5432:5432 25 | # Set health checks to wait until postgres has started 26 | options: >- 27 | --health-cmd pg_isready 28 | --health-interval 10s 29 | --health-timeout 5s 30 | --health-retries 5 31 | 32 | steps: 33 | - uses: actions/checkout@v2 34 | with: 35 | fetch-depth: 0 36 | - name: Install latest nightly 37 | uses: actions-rs/toolchain@v1 38 | with: 39 | toolchain: nightly 40 | override: true 41 | components: rustfmt, clippy 42 | - uses: davidB/rust-cargo-make@v1 43 | - name: Run format 44 | run: cargo make format 45 | - name: Run check 46 | run: cargo make check 47 | - name: Run clippy 48 | run: cargo make clippy 49 | - name: Run test 50 | run: cargo make test 51 | env: 52 | INFLUXDB_HOST: http://localhost:8086 53 | - name: Generate code coverage 54 | run: cargo make coverage 55 | env: 56 | INFLUXDB_HOST: http://localhost:8086 57 | - name: Upload to codecov.io 58 | uses: codecov/codecov-action@v1 59 | with: 60 | fail_ci_if_error: true 61 | -------------------------------------------------------------------------------- /tests/test_set_thermostat_status.rs: -------------------------------------------------------------------------------- 1 | #[macro_use] 2 | extern crate serial_test; 3 | 4 | mod common; 5 | 6 | #[cfg(test)] 7 | mod tests { 8 | use actix_web::test; 9 | 10 | use crate::common::app::create_app; 11 | 12 | #[actix_rt::test] 13 | #[serial] 14 | async fn test_get() { 15 | let mut app = create_app().await; 16 | 17 | let req = test::TestRequest::get() 18 | .uri("/graphql?query=mutation{setThermostatStatus(data:{status:true}){id,status,timestamp}}") 19 | .header("key", "123") 20 | .header("content-type", "application/json") 21 | .to_request(); 22 | 23 | let resp: serde_json::Value = test::read_response_json(&mut app, req).await; 24 | let status = &resp["data"]["setThermostatStatus"]; 25 | 26 | assert!(status.is_object()); 27 | assert_eq!(status["id"], 2); 28 | assert_eq!(status["status"], true); 29 | assert!(status["timestamp"].is_number()); 30 | } 31 | 32 | #[actix_rt::test] 33 | #[serial] 34 | async fn test_post() { 35 | let mut app = create_app().await; 36 | 37 | let req = test::TestRequest::post() 38 | .uri("/graphql") 39 | .header("key", "123") 40 | .header("content-type", "application/json") 41 | .set_payload(r#"{"query": "mutation{setThermostatStatus(data:{status:true}){id,status,timestamp}}"}"#) 42 | .to_request(); 43 | 44 | let resp: serde_json::Value = test::read_response_json(&mut app, req).await; 45 | let status = &resp["data"]["setThermostatStatus"]; 46 | 47 | assert!(status.is_object()); 48 | assert_eq!(status["id"], 2); 49 | assert_eq!(status["status"], true); 50 | assert!(status["timestamp"].is_number()); 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /tests/common/app.rs: -------------------------------------------------------------------------------- 1 | use actix_http::error::Error; 2 | use actix_http::Request; 3 | use actix_web::dev::Service; 4 | use actix_web::dev::ServiceResponse; 5 | use actix_web::{test, web, App}; 6 | 7 | use diesel_migrations::{revert_latest_migration, run_pending_migrations}; 8 | use dotenv::dotenv; 9 | 10 | use lib::db::{establish_connection, DatabaseKind}; 11 | use lib::handlers::graphql::graphql; 12 | use lib::models::key::Key; 13 | use lib::schema_graphql::create_schema; 14 | 15 | pub async fn create_app( 16 | ) -> impl Service { 17 | // load .env variables 18 | dotenv().ok(); 19 | 20 | let key = std::env::var("API_KEY").expect("Missing `API_KEY` env variable"); 21 | let key = Key::new(key); 22 | 23 | // create Juniper schema 24 | let schema = std::sync::Arc::new(create_schema()); 25 | 26 | // database connection pool 27 | let db_pool = establish_connection(DatabaseKind::ExampleTest); 28 | 29 | // get connection 30 | let connection = db_pool.get().unwrap(); 31 | 32 | // revert migration 33 | // this works currently only because there is a single migration 34 | // will need to figure out how to do this for multiple migrations 35 | revert_latest_migration(&connection).ok(); 36 | 37 | // run pending migrations 38 | run_pending_migrations(&connection).expect("run pending migrations error"); 39 | 40 | // http test server 41 | test::init_service( 42 | App::new() 43 | .data(db_pool.clone()) 44 | .data(schema.clone()) 45 | .data(key.clone()) 46 | .service( 47 | web::resource("/graphql") 48 | .route(web::get().to(graphql)) 49 | .route(web::post().to(graphql)), 50 | ), 51 | ) 52 | .await 53 | } 54 | -------------------------------------------------------------------------------- /tests/test_key.rs: -------------------------------------------------------------------------------- 1 | #[macro_use] 2 | extern crate serial_test; 3 | 4 | mod common; 5 | 6 | #[cfg(test)] 7 | mod tests { 8 | use actix_web::test; 9 | 10 | use crate::common::app::create_app; 11 | use ::lib::models::errors::GraphQLErrors; 12 | 13 | #[actix_rt::test] 14 | #[serial] 15 | async fn test_no_key() { 16 | let mut app = create_app().await; 17 | 18 | let req = test::TestRequest::get() 19 | .uri("/graphql?query={thermostatStatus{id,status,timestamp}}") 20 | .to_request(); 21 | 22 | let response: GraphQLErrors = test::read_response_json(&mut app, req).await; 23 | let message = &response.errors[0].message; 24 | 25 | assert_eq!(message, "Missing header: key"); 26 | } 27 | 28 | #[actix_rt::test] 29 | #[serial] 30 | async fn test_wrong_key() { 31 | let mut app = create_app().await; 32 | 33 | let req = test::TestRequest::get() 34 | .uri("/graphql?query={thermostatStatus{id,status,timestamp}}") 35 | .header("key", "321") 36 | .to_request(); 37 | 38 | let response: GraphQLErrors = test::read_response_json(&mut app, req).await; 39 | let message = &response.errors[0].message; 40 | 41 | assert_eq!(message, "Invalid Key"); 42 | } 43 | 44 | #[actix_rt::test] 45 | #[serial] 46 | async fn test_correct_key() { 47 | let mut app = create_app().await; 48 | 49 | let req = test::TestRequest::get() 50 | .uri("/graphql?query={thermostatStatus{id,status,timestamp}}") 51 | .header("key", "123") 52 | .to_request(); 53 | 54 | let response: serde_json::Value = test::read_response_json(&mut app, req).await; 55 | let status = &response["data"]["thermostatStatus"]; 56 | 57 | assert!(status.is_object()); 58 | assert_eq!(status["id"], 1); 59 | assert_eq!(status["status"], false); 60 | assert!(status["timestamp"].is_number()); 61 | } 62 | } 63 | -------------------------------------------------------------------------------- /src/schema_graphql.rs: -------------------------------------------------------------------------------- 1 | use std::sync::Arc; 2 | 3 | use juniper::{graphql_object, RootNode}; 4 | use juniper::{EmptySubscription, FieldResult}; 5 | 6 | use crate::db::DbPool; 7 | use crate::models::thermostat_status::*; 8 | 9 | #[derive(Clone)] 10 | pub struct Context { 11 | pub db_pool: Arc, 12 | } 13 | 14 | impl juniper::Context for Context {} 15 | 16 | pub struct QueryRoot; 17 | 18 | #[graphql_object(context = Context)] 19 | impl QueryRoot { 20 | #[graphql(description = "Query the current (latest) thermostat status")] 21 | fn thermostat_status(context: &Context) -> FieldResult { 22 | let connection = &context.db_pool.get()?; 23 | 24 | let result = ThermostatStatus::get_latest(connection)?; 25 | Ok(result) 26 | } 27 | 28 | #[graphql(description = "Query the thermostat status history")] 29 | fn thermostat_status_history(context: &Context) -> FieldResult> { 30 | let connection = &context.db_pool.get()?; 31 | 32 | let results = ThermostatStatus::get_history(connection)?; 33 | Ok(results) 34 | } 35 | } 36 | 37 | pub struct MutationRoot; 38 | 39 | #[graphql_object(context = Context)] 40 | impl MutationRoot { 41 | #[graphql(description = "Set the thermostat status")] 42 | fn set_thermostat_status( 43 | context: &Context, 44 | data: NewThermostatStatus, 45 | ) -> FieldResult { 46 | let connection = &context.db_pool.get()?; 47 | 48 | ThermostatStatus::insert(connection, data)?; 49 | 50 | let result = ThermostatStatus::get_latest(connection)?; 51 | Ok(result) 52 | } 53 | } 54 | 55 | pub type SchemaGraphQL = RootNode<'static, QueryRoot, MutationRoot, EmptySubscription>; 56 | 57 | pub fn create_schema() -> SchemaGraphQL { 58 | SchemaGraphQL::new(QueryRoot {}, MutationRoot {}, EmptySubscription::new()) 59 | } 60 | 61 | pub fn create_context(db_pool: Arc) -> Context { 62 | Context { db_pool } 63 | } 64 | -------------------------------------------------------------------------------- /src/handlers/graphql.rs: -------------------------------------------------------------------------------- 1 | use std::sync::Arc; 2 | 3 | use actix_web::http::header::HeaderMap; 4 | use actix_web::http::Method; 5 | use actix_web::{web, Error, HttpRequest, HttpResponse}; 6 | use juniper::http::{playground::playground_source, GraphQLRequest}; 7 | use juniper::serde::ser::Error as SerdeError; 8 | 9 | use crate::db::DbPool; 10 | use crate::models::errors::GraphQLErrors; 11 | use crate::models::key::Key; 12 | use crate::schema_graphql::{create_context, SchemaGraphQL}; 13 | 14 | pub async fn playground() -> HttpResponse { 15 | let html = playground_source("/graphql", None); 16 | HttpResponse::Ok() 17 | .content_type("text/html; charset=utf-8") 18 | .body(html) 19 | } 20 | 21 | pub async fn graphql( 22 | req: HttpRequest, 23 | st: web::Data>, 24 | data_query: Option>, 25 | data_body: Option>, 26 | db_pool: web::Data, 27 | key: web::Data, 28 | ) -> Result { 29 | let headers = req.headers(); 30 | 31 | // fetch data from 32 | // query string if this is a GET 33 | // body if this is a POST 34 | let data = match *req.method() { 35 | Method::GET => data_query.unwrap().into_inner(), 36 | _ => data_body.unwrap().into_inner(), 37 | }; 38 | 39 | // let introspection queries through 40 | if data.operation_name() != Some("IntrospectionQuery") { 41 | // validate key for all other requests 42 | if let Err(e) = validate_key(&headers, key.get_ref()) { 43 | let err = GraphQLErrors::new(e); 44 | 45 | return Ok(HttpResponse::Ok().json(&err)); 46 | } 47 | } 48 | 49 | let db_pool = (*db_pool).clone(); 50 | let ctx = create_context(db_pool); 51 | let res = data.execute(&st, &ctx).await; 52 | 53 | Ok(HttpResponse::Ok().json(res)) 54 | } 55 | 56 | fn validate_key<'a>(headers: &'a HeaderMap, key: &'a Key) -> Result<(), &'a str> { 57 | match headers.get("key") { 58 | Some(value) => { 59 | let value = value 60 | .to_str() 61 | .map_err(serde_json::error::Error::custom) 62 | .unwrap(); 63 | 64 | if value != key.value { 65 | return Err("Invalid Key"); 66 | } 67 | } 68 | None => { 69 | return Err("Missing header: key"); 70 | } 71 | } 72 | 73 | Ok(()) 74 | } 75 | -------------------------------------------------------------------------------- /src/main.rs: -------------------------------------------------------------------------------- 1 | use std::io; 2 | 3 | use actix_cors::Cors; 4 | use actix_web::{middleware, web, App, HttpResponse, HttpServer}; 5 | use diesel_migrations::run_pending_migrations; 6 | use dotenv::dotenv; 7 | 8 | use ::lib::db::{establish_connection, DatabaseKind}; 9 | use ::lib::handlers::graphql::{graphql, playground}; 10 | use ::lib::models::key::Key; 11 | use ::lib::schema_graphql::create_schema; 12 | 13 | #[actix_rt::main] 14 | async fn main() -> io::Result<()> { 15 | // load .env variables 16 | dotenv().ok(); 17 | 18 | let host = std::env::var("HOST").expect("Missing `HOST` env variable"); 19 | let port = std::env::var("PORT").expect("Missing `PORT` env variable"); 20 | let key = std::env::var("API_KEY").expect("Missing `API_KEY` env variable"); 21 | let key = Key::new(key); 22 | 23 | // configure logging 24 | std::env::set_var("RUST_LOG", "actix_web=info"); 25 | env_logger::init(); 26 | 27 | // create Juniper schema 28 | let schema = std::sync::Arc::new(create_schema()); 29 | 30 | // database connection pool 31 | let db_pool = establish_connection(DatabaseKind::Example); 32 | 33 | // run pending migrations 34 | let connection = db_pool.get().unwrap(); 35 | run_pending_migrations(&connection) 36 | .map_err(|e| std::io::Error::new(std::io::ErrorKind::Other, e))?; 37 | 38 | println!("Starting GraphQL server at http://{}:{}", host, port); 39 | 40 | // start http server 41 | HttpServer::new(move || { 42 | App::new() 43 | .data(db_pool.clone()) 44 | .data(schema.clone()) 45 | .data(key.clone()) 46 | .wrap(middleware::Compress::default()) 47 | .wrap(middleware::Logger::default()) 48 | .wrap( 49 | Cors::default() 50 | .allowed_origin("http://localhost:8080") 51 | .allowed_methods(vec!["GET", "POST"]), 52 | ) // allow all cross origin requests 53 | .service( 54 | web::resource("/graphql") 55 | .route(web::get().to(graphql)) 56 | .route(web::post().to(graphql)), 57 | ) 58 | .service(web::resource("/playground").route(web::get().to(playground))) 59 | .default_service(web::route().to(|| { 60 | HttpResponse::Found() 61 | .header("location", "/playground") 62 | .finish() 63 | })) 64 | }) 65 | .bind(format!("{}:{}", host, port))? 66 | .run() 67 | .await 68 | } 69 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Overview 2 | 3 | [![CI][ci_badge]][ci] 4 | [![codecov][codecov_badge]][codecov] 5 | 6 | This is an example project that puts together Rust, Actix, Juniper and Diesel. 7 | 8 | I've started with only very little knowledge of Rust. The learning curve was pretty steep but well worth the effort in the end. I'm sharing this example project in the hope that it will save someone time and prevent frustration. 9 | 10 | ## Main features 11 | 12 | - GraphQL Server & Playground (Actix + Juniper) 13 | - Queries using both POST and GET 14 | - Database Access (Diesel + Postgres) 15 | - Pending migrations run automatically on web server startup 16 | - Cors 17 | - Authentication (API key in headers) 18 | 19 | ``` 20 | { 21 | "key": "123" 22 | } 23 | ``` 24 | 25 | - Integration tests 26 | - cargo-make support 27 | - Docker Compose 28 | - Github Actions workflows 29 | 30 | - CI: format, check, clippy, tests, code coverage 31 | - Security audit 32 | 33 | # Setup 34 | 35 | ## Rust & Cargo 36 | 37 | Install `rust` and `cargo` via `rustup` (https://rustup.rs/). The stable version is OK. 38 | 39 | ## cargo-make 40 | 41 | ``` 42 | cargo install cargo-make 43 | ``` 44 | 45 | ## Diesel CLI 46 | 47 | ``` 48 | cargo install diesel_cli --no-default-features --features postgres 49 | ``` 50 | 51 | Optional: Cargo Watch (not required, but it speeds up development greatly) 52 | 53 | ``` 54 | cargo install cargo-watch 55 | ``` 56 | 57 | ## Databases 58 | 59 | ``` 60 | psql -U postgres 61 | CREATE DATABASE rust_graphql_example; 62 | CREATE DATABASE rust_graphql_example_test; 63 | ``` 64 | 65 | # Run locally 66 | 67 | Access to a postgres instance is required. 68 | 69 | ``` 70 | cargo make run 71 | ``` 72 | 73 | or 74 | 75 | ``` 76 | cargo make watch 77 | ``` 78 | 79 | Open http://localhost:8080/playground. 80 | 81 | # Run Integration tests 82 | 83 | ``` 84 | cargo make test 85 | ``` 86 | 87 | # Run in Docker 88 | 89 | ``` 90 | docker volume create --name=rust-graphql-example-storage 91 | docker-compose up 92 | ``` 93 | 94 | Open http://localhost:8080/playground. 95 | 96 | [ci_badge]: https://github.com/mihai-dinculescu/rust-graphql-actix-juniper-diesel-example/workflows/CI/badge.svg?branch=master 97 | [ci]: https://github.com/mihai-dinculescu/rust-graphql-actix-juniper-diesel-example/actions 98 | [codecov_badge]: https://codecov.io/gh/mihai-dinculescu/rust-graphql-actix-juniper-diesel-example/branch/master/graph/badge.svg 99 | [codecov]: https://codecov.io/gh/mihai-dinculescu/rust-graphql-actix-juniper-diesel-example 100 | -------------------------------------------------------------------------------- /tests/test_thermostat_status.rs: -------------------------------------------------------------------------------- 1 | #[macro_use] 2 | extern crate serial_test; 3 | 4 | mod common; 5 | 6 | #[cfg(test)] 7 | mod tests { 8 | use actix_web::test; 9 | 10 | use crate::common::app::create_app; 11 | use crate::common::helpers::set_thermostat_status; 12 | 13 | #[actix_rt::test] 14 | #[serial] 15 | async fn test_get() { 16 | let mut app = create_app().await; 17 | 18 | let req = test::TestRequest::get() 19 | .uri("/graphql?query={thermostatStatus{id,status,timestamp}}") 20 | .header("key", "123") 21 | .header("content-type", "application/json") 22 | .to_request(); 23 | 24 | let resp: serde_json::Value = test::read_response_json(&mut app, req).await; 25 | let status = &resp["data"]["thermostatStatus"]; 26 | 27 | assert!(status.is_object()); 28 | assert_eq!(status["id"], 1); 29 | assert_eq!(status["status"], false); 30 | assert!(status["timestamp"].is_number()); 31 | } 32 | 33 | #[actix_rt::test] 34 | #[serial] 35 | async fn test_post() { 36 | let mut app = create_app().await; 37 | 38 | let req = test::TestRequest::post() 39 | .uri("/graphql") 40 | .header("key", "123") 41 | .header("content-type", "application/json") 42 | .set_payload(r#"{"query": "{thermostatStatus{id,status,timestamp}}"}"#) 43 | .to_request(); 44 | 45 | let resp: serde_json::Value = test::read_response_json(&mut app, req).await; 46 | let status = &resp["data"]["thermostatStatus"]; 47 | 48 | assert!(status.is_object()); 49 | assert_eq!(status["id"], 1); 50 | assert_eq!(status["status"], false); 51 | assert!(status["timestamp"].is_number()); 52 | } 53 | 54 | #[actix_rt::test] 55 | #[serial] 56 | async fn test_new_status() { 57 | let mut app = create_app().await; 58 | 59 | set_thermostat_status(&mut app, true).await; 60 | 61 | let req = test::TestRequest::post() 62 | .uri("/graphql") 63 | .header("key", "123") 64 | .header("content-type", "application/json") 65 | .set_payload(r#"{"query": "{thermostatStatus{id,status,timestamp}}"}"#) 66 | .to_request(); 67 | 68 | let resp: serde_json::Value = test::read_response_json(&mut app, req).await; 69 | let status = &resp["data"]["thermostatStatus"]; 70 | 71 | assert!(status.is_object()); 72 | assert_eq!(status["id"], 2); 73 | assert_eq!(status["status"], true); 74 | assert!(status["timestamp"].is_number()); 75 | } 76 | } 77 | -------------------------------------------------------------------------------- /tests/test_thermostat_status_history.rs: -------------------------------------------------------------------------------- 1 | #[macro_use] 2 | extern crate serial_test; 3 | 4 | mod common; 5 | 6 | #[cfg(test)] 7 | mod tests { 8 | use actix_web::test; 9 | 10 | use crate::common::app::create_app; 11 | use crate::common::helpers::set_thermostat_status; 12 | 13 | #[actix_rt::test] 14 | #[serial] 15 | async fn test_get() { 16 | let mut app = create_app().await; 17 | 18 | let req = test::TestRequest::get() 19 | .uri("/graphql?query={thermostatStatusHistory{id,status,timestamp}}") 20 | .header("key", "123") 21 | .header("content-type", "application/json") 22 | .to_request(); 23 | 24 | let resp: serde_json::Value = test::read_response_json(&mut app, req).await; 25 | 26 | let history = &resp["data"]["thermostatStatusHistory"]; 27 | assert!(history.is_array()); 28 | assert_eq!(history.as_array().unwrap().len(), 1); 29 | 30 | let status = &history[0]; 31 | assert!(status.is_object()); 32 | assert_eq!(status["id"], 1); 33 | assert_eq!(status["status"], false); 34 | assert!(status["timestamp"].is_number()); 35 | } 36 | 37 | #[actix_rt::test] 38 | #[serial] 39 | async fn test_post() { 40 | let mut app = create_app().await; 41 | 42 | let req = test::TestRequest::post() 43 | .uri("/graphql") 44 | .header("key", "123") 45 | .header("content-type", "application/json") 46 | .set_payload(r#"{"query": "{thermostatStatusHistory{id,status,timestamp}}"}"#) 47 | .to_request(); 48 | 49 | let resp: serde_json::Value = test::read_response_json(&mut app, req).await; 50 | 51 | let history = &resp["data"]["thermostatStatusHistory"]; 52 | assert!(history.is_array()); 53 | assert_eq!(history.as_array().unwrap().len(), 1); 54 | 55 | let status = &history[0]; 56 | 57 | assert!(status.is_object()); 58 | assert_eq!(status["id"], 1); 59 | assert_eq!(status["status"], false); 60 | assert!(status["timestamp"].is_number()); 61 | } 62 | 63 | #[actix_rt::test] 64 | #[serial] 65 | async fn test_new_status() { 66 | let mut app = create_app().await; 67 | 68 | set_thermostat_status(&mut app, true).await; 69 | 70 | let req = test::TestRequest::post() 71 | .uri("/graphql") 72 | .header("key", "123") 73 | .header("content-type", "application/json") 74 | .set_payload(r#"{"query": "{thermostatStatusHistory{id,status,timestamp}}"}"#) 75 | .to_request(); 76 | 77 | let resp: serde_json::Value = test::read_response_json(&mut app, req).await; 78 | 79 | let history = &resp["data"]["thermostatStatusHistory"]; 80 | assert!(history.is_array()); 81 | assert_eq!(history.as_array().unwrap().len(), 2); 82 | 83 | let status = &history[0]; 84 | 85 | assert!(status.is_object()); 86 | assert_eq!(status["id"], 2); 87 | assert_eq!(status["status"], true); 88 | assert!(status["timestamp"].is_number()); 89 | } 90 | } 91 | -------------------------------------------------------------------------------- /Cargo.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Cargo. 2 | # It is not intended for manual editing. 3 | [[package]] 4 | name = "actix-codec" 5 | version = "0.3.0" 6 | source = "registry+https://github.com/rust-lang/crates.io-index" 7 | checksum = "78d1833b3838dbe990df0f1f87baf640cf6146e898166afe401839d1b001e570" 8 | dependencies = [ 9 | "bitflags", 10 | "bytes 0.5.6", 11 | "futures-core", 12 | "futures-sink", 13 | "log", 14 | "pin-project 0.4.27", 15 | "tokio", 16 | "tokio-util", 17 | ] 18 | 19 | [[package]] 20 | name = "actix-connect" 21 | version = "2.0.0" 22 | source = "registry+https://github.com/rust-lang/crates.io-index" 23 | checksum = "177837a10863f15ba8d3ae3ec12fac1099099529ed20083a27fdfe247381d0dc" 24 | dependencies = [ 25 | "actix-codec", 26 | "actix-rt", 27 | "actix-service", 28 | "actix-utils", 29 | "derive_more", 30 | "either", 31 | "futures-util", 32 | "http", 33 | "log", 34 | "trust-dns-proto", 35 | "trust-dns-resolver", 36 | ] 37 | 38 | [[package]] 39 | name = "actix-cors" 40 | version = "0.5.4" 41 | source = "registry+https://github.com/rust-lang/crates.io-index" 42 | checksum = "36b133d8026a9f209a9aeeeacd028e7451bcca975f592881b305d37983f303d7" 43 | dependencies = [ 44 | "actix-web", 45 | "derive_more", 46 | "futures-util", 47 | "log", 48 | "once_cell", 49 | "tinyvec", 50 | ] 51 | 52 | [[package]] 53 | name = "actix-http" 54 | version = "2.2.0" 55 | source = "registry+https://github.com/rust-lang/crates.io-index" 56 | checksum = "452299e87817ae5673910e53c243484ca38be3828db819b6011736fc6982e874" 57 | dependencies = [ 58 | "actix-codec", 59 | "actix-connect", 60 | "actix-rt", 61 | "actix-service", 62 | "actix-threadpool", 63 | "actix-utils", 64 | "base64 0.13.0", 65 | "bitflags", 66 | "brotli2", 67 | "bytes 0.5.6", 68 | "cookie", 69 | "copyless", 70 | "derive_more", 71 | "either", 72 | "encoding_rs", 73 | "flate2", 74 | "futures-channel", 75 | "futures-core", 76 | "futures-util", 77 | "fxhash", 78 | "h2", 79 | "http", 80 | "httparse", 81 | "indexmap", 82 | "itoa", 83 | "language-tags", 84 | "lazy_static", 85 | "log", 86 | "mime", 87 | "percent-encoding", 88 | "pin-project 1.0.5", 89 | "rand", 90 | "regex", 91 | "serde", 92 | "serde_json", 93 | "serde_urlencoded", 94 | "sha-1", 95 | "slab", 96 | "time 0.2.25", 97 | ] 98 | 99 | [[package]] 100 | name = "actix-macros" 101 | version = "0.1.3" 102 | source = "registry+https://github.com/rust-lang/crates.io-index" 103 | checksum = "b4ca8ce00b267af8ccebbd647de0d61e0674b6e61185cc7a592ff88772bed655" 104 | dependencies = [ 105 | "quote", 106 | "syn", 107 | ] 108 | 109 | [[package]] 110 | name = "actix-router" 111 | version = "0.2.6" 112 | source = "registry+https://github.com/rust-lang/crates.io-index" 113 | checksum = "b8be584b3b6c705a18eabc11c4059cf83b255bdd8511673d1d569f4ce40c69de" 114 | dependencies = [ 115 | "bytestring", 116 | "http", 117 | "log", 118 | "regex", 119 | "serde", 120 | ] 121 | 122 | [[package]] 123 | name = "actix-rt" 124 | version = "1.1.1" 125 | source = "registry+https://github.com/rust-lang/crates.io-index" 126 | checksum = "143fcc2912e0d1de2bcf4e2f720d2a60c28652ab4179685a1ee159e0fb3db227" 127 | dependencies = [ 128 | "actix-macros", 129 | "actix-threadpool", 130 | "copyless", 131 | "futures-channel", 132 | "futures-util", 133 | "smallvec", 134 | "tokio", 135 | ] 136 | 137 | [[package]] 138 | name = "actix-server" 139 | version = "1.0.4" 140 | source = "registry+https://github.com/rust-lang/crates.io-index" 141 | checksum = "45407e6e672ca24784baa667c5d32ef109ccdd8d5e0b5ebb9ef8a67f4dfb708e" 142 | dependencies = [ 143 | "actix-codec", 144 | "actix-rt", 145 | "actix-service", 146 | "actix-utils", 147 | "futures-channel", 148 | "futures-util", 149 | "log", 150 | "mio", 151 | "mio-uds", 152 | "num_cpus", 153 | "slab", 154 | "socket2", 155 | ] 156 | 157 | [[package]] 158 | name = "actix-service" 159 | version = "1.0.6" 160 | source = "registry+https://github.com/rust-lang/crates.io-index" 161 | checksum = "0052435d581b5be835d11f4eb3bce417c8af18d87ddf8ace99f8e67e595882bb" 162 | dependencies = [ 163 | "futures-util", 164 | "pin-project 0.4.27", 165 | ] 166 | 167 | [[package]] 168 | name = "actix-testing" 169 | version = "1.0.1" 170 | source = "registry+https://github.com/rust-lang/crates.io-index" 171 | checksum = "47239ca38799ab74ee6a8a94d1ce857014b2ac36f242f70f3f75a66f691e791c" 172 | dependencies = [ 173 | "actix-macros", 174 | "actix-rt", 175 | "actix-server", 176 | "actix-service", 177 | "log", 178 | "socket2", 179 | ] 180 | 181 | [[package]] 182 | name = "actix-threadpool" 183 | version = "0.3.3" 184 | source = "registry+https://github.com/rust-lang/crates.io-index" 185 | checksum = "d209f04d002854b9afd3743032a27b066158817965bf5d036824d19ac2cc0e30" 186 | dependencies = [ 187 | "derive_more", 188 | "futures-channel", 189 | "lazy_static", 190 | "log", 191 | "num_cpus", 192 | "parking_lot", 193 | "threadpool", 194 | ] 195 | 196 | [[package]] 197 | name = "actix-tls" 198 | version = "2.0.0" 199 | source = "registry+https://github.com/rust-lang/crates.io-index" 200 | checksum = "24789b7d7361cf5503a504ebe1c10806896f61e96eca9a7350e23001aca715fb" 201 | dependencies = [ 202 | "actix-codec", 203 | "actix-service", 204 | "actix-utils", 205 | "futures-util", 206 | ] 207 | 208 | [[package]] 209 | name = "actix-utils" 210 | version = "2.0.0" 211 | source = "registry+https://github.com/rust-lang/crates.io-index" 212 | checksum = "2e9022dec56632d1d7979e59af14f0597a28a830a9c1c7fec8b2327eb9f16b5a" 213 | dependencies = [ 214 | "actix-codec", 215 | "actix-rt", 216 | "actix-service", 217 | "bitflags", 218 | "bytes 0.5.6", 219 | "either", 220 | "futures-channel", 221 | "futures-sink", 222 | "futures-util", 223 | "log", 224 | "pin-project 0.4.27", 225 | "slab", 226 | ] 227 | 228 | [[package]] 229 | name = "actix-web" 230 | version = "3.3.2" 231 | source = "registry+https://github.com/rust-lang/crates.io-index" 232 | checksum = "e641d4a172e7faa0862241a20ff4f1f5ab0ab7c279f00c2d4587b77483477b86" 233 | dependencies = [ 234 | "actix-codec", 235 | "actix-http", 236 | "actix-macros", 237 | "actix-router", 238 | "actix-rt", 239 | "actix-server", 240 | "actix-service", 241 | "actix-testing", 242 | "actix-threadpool", 243 | "actix-tls", 244 | "actix-utils", 245 | "actix-web-codegen", 246 | "awc", 247 | "bytes 0.5.6", 248 | "derive_more", 249 | "encoding_rs", 250 | "futures-channel", 251 | "futures-core", 252 | "futures-util", 253 | "fxhash", 254 | "log", 255 | "mime", 256 | "pin-project 1.0.5", 257 | "regex", 258 | "serde", 259 | "serde_json", 260 | "serde_urlencoded", 261 | "socket2", 262 | "time 0.2.25", 263 | "tinyvec", 264 | "url", 265 | ] 266 | 267 | [[package]] 268 | name = "actix-web-codegen" 269 | version = "0.4.0" 270 | source = "registry+https://github.com/rust-lang/crates.io-index" 271 | checksum = "ad26f77093333e0e7c6ffe54ebe3582d908a104e448723eec6d43d08b07143fb" 272 | dependencies = [ 273 | "proc-macro2", 274 | "quote", 275 | "syn", 276 | ] 277 | 278 | [[package]] 279 | name = "addr2line" 280 | version = "0.14.1" 281 | source = "registry+https://github.com/rust-lang/crates.io-index" 282 | checksum = "a55f82cfe485775d02112886f4169bde0c5894d75e79ead7eafe7e40a25e45f7" 283 | dependencies = [ 284 | "gimli", 285 | ] 286 | 287 | [[package]] 288 | name = "adler" 289 | version = "0.2.3" 290 | source = "registry+https://github.com/rust-lang/crates.io-index" 291 | checksum = "ee2a4ec343196209d6594e19543ae87a39f96d5534d7174822a3ad825dd6ed7e" 292 | 293 | [[package]] 294 | name = "aho-corasick" 295 | version = "0.7.15" 296 | source = "registry+https://github.com/rust-lang/crates.io-index" 297 | checksum = "7404febffaa47dac81aa44dba71523c9d069b1bdc50a77db41195149e17f68e5" 298 | dependencies = [ 299 | "memchr", 300 | ] 301 | 302 | [[package]] 303 | name = "ascii" 304 | version = "0.9.3" 305 | source = "registry+https://github.com/rust-lang/crates.io-index" 306 | checksum = "eab1c04a571841102f5345a8fc0f6bb3d31c315dec879b5c6e42e40ce7ffa34e" 307 | 308 | [[package]] 309 | name = "async-trait" 310 | version = "0.1.42" 311 | source = "registry+https://github.com/rust-lang/crates.io-index" 312 | checksum = "8d3a45e77e34375a7923b1e8febb049bb011f064714a8e17a1a616fef01da13d" 313 | dependencies = [ 314 | "proc-macro2", 315 | "quote", 316 | "syn", 317 | ] 318 | 319 | [[package]] 320 | name = "atty" 321 | version = "0.2.14" 322 | source = "registry+https://github.com/rust-lang/crates.io-index" 323 | checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" 324 | dependencies = [ 325 | "hermit-abi", 326 | "libc", 327 | "winapi 0.3.9", 328 | ] 329 | 330 | [[package]] 331 | name = "autocfg" 332 | version = "1.0.1" 333 | source = "registry+https://github.com/rust-lang/crates.io-index" 334 | checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a" 335 | 336 | [[package]] 337 | name = "awc" 338 | version = "2.0.3" 339 | source = "registry+https://github.com/rust-lang/crates.io-index" 340 | checksum = "b381e490e7b0cfc37ebc54079b0413d8093ef43d14a4e4747083f7fa47a9e691" 341 | dependencies = [ 342 | "actix-codec", 343 | "actix-http", 344 | "actix-rt", 345 | "actix-service", 346 | "base64 0.13.0", 347 | "bytes 0.5.6", 348 | "cfg-if 1.0.0", 349 | "derive_more", 350 | "futures-core", 351 | "log", 352 | "mime", 353 | "percent-encoding", 354 | "rand", 355 | "serde", 356 | "serde_json", 357 | "serde_urlencoded", 358 | ] 359 | 360 | [[package]] 361 | name = "backtrace" 362 | version = "0.3.56" 363 | source = "registry+https://github.com/rust-lang/crates.io-index" 364 | checksum = "9d117600f438b1707d4e4ae15d3595657288f8235a0eb593e80ecc98ab34e1bc" 365 | dependencies = [ 366 | "addr2line", 367 | "cfg-if 1.0.0", 368 | "libc", 369 | "miniz_oxide", 370 | "object", 371 | "rustc-demangle", 372 | ] 373 | 374 | [[package]] 375 | name = "base-x" 376 | version = "0.2.8" 377 | source = "registry+https://github.com/rust-lang/crates.io-index" 378 | checksum = "a4521f3e3d031370679b3b140beb36dfe4801b09ac77e30c61941f97df3ef28b" 379 | 380 | [[package]] 381 | name = "base64" 382 | version = "0.12.3" 383 | source = "registry+https://github.com/rust-lang/crates.io-index" 384 | checksum = "3441f0f7b02788e948e47f457ca01f1d7e6d92c693bc132c22b087d3141c03ff" 385 | 386 | [[package]] 387 | name = "base64" 388 | version = "0.13.0" 389 | source = "registry+https://github.com/rust-lang/crates.io-index" 390 | checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd" 391 | 392 | [[package]] 393 | name = "bitflags" 394 | version = "1.2.1" 395 | source = "registry+https://github.com/rust-lang/crates.io-index" 396 | checksum = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693" 397 | 398 | [[package]] 399 | name = "block-buffer" 400 | version = "0.9.0" 401 | source = "registry+https://github.com/rust-lang/crates.io-index" 402 | checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" 403 | dependencies = [ 404 | "generic-array", 405 | ] 406 | 407 | [[package]] 408 | name = "brotli-sys" 409 | version = "0.3.2" 410 | source = "registry+https://github.com/rust-lang/crates.io-index" 411 | checksum = "4445dea95f4c2b41cde57cc9fee236ae4dbae88d8fcbdb4750fc1bb5d86aaecd" 412 | dependencies = [ 413 | "cc", 414 | "libc", 415 | ] 416 | 417 | [[package]] 418 | name = "brotli2" 419 | version = "0.3.2" 420 | source = "registry+https://github.com/rust-lang/crates.io-index" 421 | checksum = "0cb036c3eade309815c15ddbacec5b22c4d1f3983a774ab2eac2e3e9ea85568e" 422 | dependencies = [ 423 | "brotli-sys", 424 | "libc", 425 | ] 426 | 427 | [[package]] 428 | name = "bson" 429 | version = "1.1.0" 430 | source = "registry+https://github.com/rust-lang/crates.io-index" 431 | checksum = "c11f16001d679cb13d14b2c93c7d0fa13bb484a87c34a6c4c39707ad936499b5" 432 | dependencies = [ 433 | "base64 0.12.3", 434 | "chrono", 435 | "hex", 436 | "lazy_static", 437 | "linked-hash-map", 438 | "rand", 439 | "serde", 440 | "serde_json", 441 | ] 442 | 443 | [[package]] 444 | name = "bumpalo" 445 | version = "3.6.0" 446 | source = "registry+https://github.com/rust-lang/crates.io-index" 447 | checksum = "099e596ef14349721d9016f6b80dd3419ea1bf289ab9b44df8e4dfd3a005d5d9" 448 | 449 | [[package]] 450 | name = "byteorder" 451 | version = "1.4.2" 452 | source = "registry+https://github.com/rust-lang/crates.io-index" 453 | checksum = "ae44d1a3d5a19df61dd0c8beb138458ac2a53a7ac09eba97d55592540004306b" 454 | 455 | [[package]] 456 | name = "bytes" 457 | version = "0.5.6" 458 | source = "registry+https://github.com/rust-lang/crates.io-index" 459 | checksum = "0e4cec68f03f32e44924783795810fa50a7035d8c8ebe78580ad7e6c703fba38" 460 | 461 | [[package]] 462 | name = "bytes" 463 | version = "1.0.1" 464 | source = "registry+https://github.com/rust-lang/crates.io-index" 465 | checksum = "b700ce4376041dcd0a327fd0097c41095743c4c8af8887265942faf1100bd040" 466 | 467 | [[package]] 468 | name = "bytestring" 469 | version = "1.0.0" 470 | source = "registry+https://github.com/rust-lang/crates.io-index" 471 | checksum = "90706ba19e97b90786e19dc0d5e2abd80008d99d4c0c5d1ad0b5e72cec7c494d" 472 | dependencies = [ 473 | "bytes 1.0.1", 474 | ] 475 | 476 | [[package]] 477 | name = "cc" 478 | version = "1.0.66" 479 | source = "registry+https://github.com/rust-lang/crates.io-index" 480 | checksum = "4c0496836a84f8d0495758516b8621a622beb77c0fed418570e50764093ced48" 481 | 482 | [[package]] 483 | name = "cfg-if" 484 | version = "0.1.10" 485 | source = "registry+https://github.com/rust-lang/crates.io-index" 486 | checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" 487 | 488 | [[package]] 489 | name = "cfg-if" 490 | version = "1.0.0" 491 | source = "registry+https://github.com/rust-lang/crates.io-index" 492 | checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" 493 | 494 | [[package]] 495 | name = "chrono" 496 | version = "0.4.19" 497 | source = "registry+https://github.com/rust-lang/crates.io-index" 498 | checksum = "670ad68c9088c2a963aaa298cb369688cf3f9465ce5e2d4ca10e6e0098a1ce73" 499 | dependencies = [ 500 | "libc", 501 | "num-integer", 502 | "num-traits", 503 | "serde", 504 | "time 0.1.44", 505 | "winapi 0.3.9", 506 | ] 507 | 508 | [[package]] 509 | name = "combine" 510 | version = "3.8.1" 511 | source = "registry+https://github.com/rust-lang/crates.io-index" 512 | checksum = "da3da6baa321ec19e1cc41d31bf599f00c783d0517095cdaf0332e3fe8d20680" 513 | dependencies = [ 514 | "ascii", 515 | "byteorder", 516 | "either", 517 | "memchr", 518 | "unreachable", 519 | ] 520 | 521 | [[package]] 522 | name = "const_fn" 523 | version = "0.4.5" 524 | source = "registry+https://github.com/rust-lang/crates.io-index" 525 | checksum = "28b9d6de7f49e22cf97ad17fc4036ece69300032f45f78f30b4a4482cdc3f4a6" 526 | 527 | [[package]] 528 | name = "cookie" 529 | version = "0.14.3" 530 | source = "registry+https://github.com/rust-lang/crates.io-index" 531 | checksum = "784ad0fbab4f3e9cef09f20e0aea6000ae08d2cb98ac4c0abc53df18803d702f" 532 | dependencies = [ 533 | "percent-encoding", 534 | "time 0.2.25", 535 | "version_check", 536 | ] 537 | 538 | [[package]] 539 | name = "copyless" 540 | version = "0.1.5" 541 | source = "registry+https://github.com/rust-lang/crates.io-index" 542 | checksum = "a2df960f5d869b2dd8532793fde43eb5427cceb126c929747a26823ab0eeb536" 543 | 544 | [[package]] 545 | name = "cpuid-bool" 546 | version = "0.1.2" 547 | source = "registry+https://github.com/rust-lang/crates.io-index" 548 | checksum = "8aebca1129a03dc6dc2b127edd729435bbc4a37e1d5f4d7513165089ceb02634" 549 | 550 | [[package]] 551 | name = "crc32fast" 552 | version = "1.2.1" 553 | source = "registry+https://github.com/rust-lang/crates.io-index" 554 | checksum = "81156fece84ab6a9f2afdb109ce3ae577e42b1228441eded99bd77f627953b1a" 555 | dependencies = [ 556 | "cfg-if 1.0.0", 557 | ] 558 | 559 | [[package]] 560 | name = "derive_more" 561 | version = "0.99.11" 562 | source = "registry+https://github.com/rust-lang/crates.io-index" 563 | checksum = "41cb0e6161ad61ed084a36ba71fbba9e3ac5aee3606fb607fe08da6acbcf3d8c" 564 | dependencies = [ 565 | "proc-macro2", 566 | "quote", 567 | "syn", 568 | ] 569 | 570 | [[package]] 571 | name = "derive_utils" 572 | version = "0.11.2" 573 | source = "registry+https://github.com/rust-lang/crates.io-index" 574 | checksum = "532b4c15dccee12c7044f1fcad956e98410860b22231e44a3b827464797ca7bf" 575 | dependencies = [ 576 | "proc-macro2", 577 | "quote", 578 | "syn", 579 | ] 580 | 581 | [[package]] 582 | name = "diesel" 583 | version = "1.4.5" 584 | source = "registry+https://github.com/rust-lang/crates.io-index" 585 | checksum = "3e2de9deab977a153492a1468d1b1c0662c1cf39e5ea87d0c060ecd59ef18d8c" 586 | dependencies = [ 587 | "bitflags", 588 | "byteorder", 589 | "chrono", 590 | "diesel_derives", 591 | "pq-sys", 592 | "r2d2", 593 | ] 594 | 595 | [[package]] 596 | name = "diesel_derives" 597 | version = "1.4.1" 598 | source = "registry+https://github.com/rust-lang/crates.io-index" 599 | checksum = "45f5098f628d02a7a0f68ddba586fb61e80edec3bdc1be3b921f4ceec60858d3" 600 | dependencies = [ 601 | "proc-macro2", 602 | "quote", 603 | "syn", 604 | ] 605 | 606 | [[package]] 607 | name = "diesel_migrations" 608 | version = "1.4.0" 609 | source = "registry+https://github.com/rust-lang/crates.io-index" 610 | checksum = "bf3cde8413353dc7f5d72fa8ce0b99a560a359d2c5ef1e5817ca731cd9008f4c" 611 | dependencies = [ 612 | "migrations_internals", 613 | "migrations_macros", 614 | ] 615 | 616 | [[package]] 617 | name = "digest" 618 | version = "0.9.0" 619 | source = "registry+https://github.com/rust-lang/crates.io-index" 620 | checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" 621 | dependencies = [ 622 | "generic-array", 623 | ] 624 | 625 | [[package]] 626 | name = "discard" 627 | version = "1.0.4" 628 | source = "registry+https://github.com/rust-lang/crates.io-index" 629 | checksum = "212d0f5754cb6769937f4501cc0e67f4f4483c8d2c3e1e922ee9edbe4ab4c7c0" 630 | 631 | [[package]] 632 | name = "dotenv" 633 | version = "0.15.0" 634 | source = "registry+https://github.com/rust-lang/crates.io-index" 635 | checksum = "77c90badedccf4105eca100756a0b1289e191f6fcbdadd3cee1d2f614f97da8f" 636 | 637 | [[package]] 638 | name = "either" 639 | version = "1.6.1" 640 | source = "registry+https://github.com/rust-lang/crates.io-index" 641 | checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457" 642 | 643 | [[package]] 644 | name = "encoding_rs" 645 | version = "0.8.28" 646 | source = "registry+https://github.com/rust-lang/crates.io-index" 647 | checksum = "80df024fbc5ac80f87dfef0d9f5209a252f2a497f7f42944cff24d8253cac065" 648 | dependencies = [ 649 | "cfg-if 1.0.0", 650 | ] 651 | 652 | [[package]] 653 | name = "enum-as-inner" 654 | version = "0.3.3" 655 | source = "registry+https://github.com/rust-lang/crates.io-index" 656 | checksum = "7c5f0096a91d210159eceb2ff5e1c4da18388a170e1e3ce948aac9c8fdbbf595" 657 | dependencies = [ 658 | "heck", 659 | "proc-macro2", 660 | "quote", 661 | "syn", 662 | ] 663 | 664 | [[package]] 665 | name = "env_logger" 666 | version = "0.8.2" 667 | source = "registry+https://github.com/rust-lang/crates.io-index" 668 | checksum = "f26ecb66b4bdca6c1409b40fb255eefc2bd4f6d135dab3c3124f80ffa2a9661e" 669 | dependencies = [ 670 | "atty", 671 | "humantime", 672 | "log", 673 | "regex", 674 | "termcolor", 675 | ] 676 | 677 | [[package]] 678 | name = "flate2" 679 | version = "1.0.20" 680 | source = "registry+https://github.com/rust-lang/crates.io-index" 681 | checksum = "cd3aec53de10fe96d7d8c565eb17f2c687bb5518a2ec453b5b1252964526abe0" 682 | dependencies = [ 683 | "cfg-if 1.0.0", 684 | "crc32fast", 685 | "libc", 686 | "miniz_oxide", 687 | ] 688 | 689 | [[package]] 690 | name = "fnv" 691 | version = "1.0.7" 692 | source = "registry+https://github.com/rust-lang/crates.io-index" 693 | checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" 694 | 695 | [[package]] 696 | name = "form_urlencoded" 697 | version = "1.0.0" 698 | source = "registry+https://github.com/rust-lang/crates.io-index" 699 | checksum = "ece68d15c92e84fa4f19d3780f1294e5ca82a78a6d515f1efaabcc144688be00" 700 | dependencies = [ 701 | "matches", 702 | "percent-encoding", 703 | ] 704 | 705 | [[package]] 706 | name = "fuchsia-zircon" 707 | version = "0.3.3" 708 | source = "registry+https://github.com/rust-lang/crates.io-index" 709 | checksum = "2e9763c69ebaae630ba35f74888db465e49e259ba1bc0eda7d06f4a067615d82" 710 | dependencies = [ 711 | "bitflags", 712 | "fuchsia-zircon-sys", 713 | ] 714 | 715 | [[package]] 716 | name = "fuchsia-zircon-sys" 717 | version = "0.3.3" 718 | source = "registry+https://github.com/rust-lang/crates.io-index" 719 | checksum = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7" 720 | 721 | [[package]] 722 | name = "futures" 723 | version = "0.3.12" 724 | source = "registry+https://github.com/rust-lang/crates.io-index" 725 | checksum = "da9052a1a50244d8d5aa9bf55cbc2fb6f357c86cc52e46c62ed390a7180cf150" 726 | dependencies = [ 727 | "futures-channel", 728 | "futures-core", 729 | "futures-executor", 730 | "futures-io", 731 | "futures-sink", 732 | "futures-task", 733 | "futures-util", 734 | ] 735 | 736 | [[package]] 737 | name = "futures-channel" 738 | version = "0.3.12" 739 | source = "registry+https://github.com/rust-lang/crates.io-index" 740 | checksum = "f2d31b7ec7efab6eefc7c57233bb10b847986139d88cc2f5a02a1ae6871a1846" 741 | dependencies = [ 742 | "futures-core", 743 | "futures-sink", 744 | ] 745 | 746 | [[package]] 747 | name = "futures-core" 748 | version = "0.3.12" 749 | source = "registry+https://github.com/rust-lang/crates.io-index" 750 | checksum = "79e5145dde8da7d1b3892dad07a9c98fc04bc39892b1ecc9692cf53e2b780a65" 751 | 752 | [[package]] 753 | name = "futures-enum" 754 | version = "0.1.17" 755 | source = "registry+https://github.com/rust-lang/crates.io-index" 756 | checksum = "3422d14de7903a52e9dbc10ae05a7e14445ec61890100e098754e120b2bd7b1e" 757 | dependencies = [ 758 | "derive_utils", 759 | "quote", 760 | "syn", 761 | ] 762 | 763 | [[package]] 764 | name = "futures-executor" 765 | version = "0.3.12" 766 | source = "registry+https://github.com/rust-lang/crates.io-index" 767 | checksum = "e9e59fdc009a4b3096bf94f740a0f2424c082521f20a9b08c5c07c48d90fd9b9" 768 | dependencies = [ 769 | "futures-core", 770 | "futures-task", 771 | "futures-util", 772 | ] 773 | 774 | [[package]] 775 | name = "futures-io" 776 | version = "0.3.12" 777 | source = "registry+https://github.com/rust-lang/crates.io-index" 778 | checksum = "28be053525281ad8259d47e4de5de657b25e7bac113458555bb4b70bc6870500" 779 | 780 | [[package]] 781 | name = "futures-macro" 782 | version = "0.3.12" 783 | source = "registry+https://github.com/rust-lang/crates.io-index" 784 | checksum = "c287d25add322d9f9abdcdc5927ca398917996600182178774032e9f8258fedd" 785 | dependencies = [ 786 | "proc-macro-hack", 787 | "proc-macro2", 788 | "quote", 789 | "syn", 790 | ] 791 | 792 | [[package]] 793 | name = "futures-sink" 794 | version = "0.3.12" 795 | source = "registry+https://github.com/rust-lang/crates.io-index" 796 | checksum = "caf5c69029bda2e743fddd0582d1083951d65cc9539aebf8812f36c3491342d6" 797 | 798 | [[package]] 799 | name = "futures-task" 800 | version = "0.3.12" 801 | source = "registry+https://github.com/rust-lang/crates.io-index" 802 | checksum = "13de07eb8ea81ae445aca7b69f5f7bf15d7bf4912d8ca37d6645c77ae8a58d86" 803 | dependencies = [ 804 | "once_cell", 805 | ] 806 | 807 | [[package]] 808 | name = "futures-util" 809 | version = "0.3.12" 810 | source = "registry+https://github.com/rust-lang/crates.io-index" 811 | checksum = "632a8cd0f2a4b3fdea1657f08bde063848c3bd00f9bbf6e256b8be78802e624b" 812 | dependencies = [ 813 | "futures-channel", 814 | "futures-core", 815 | "futures-io", 816 | "futures-macro", 817 | "futures-sink", 818 | "futures-task", 819 | "memchr", 820 | "pin-project-lite 0.2.4", 821 | "pin-utils", 822 | "proc-macro-hack", 823 | "proc-macro-nested", 824 | "slab", 825 | ] 826 | 827 | [[package]] 828 | name = "fxhash" 829 | version = "0.2.1" 830 | source = "registry+https://github.com/rust-lang/crates.io-index" 831 | checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" 832 | dependencies = [ 833 | "byteorder", 834 | ] 835 | 836 | [[package]] 837 | name = "generic-array" 838 | version = "0.14.4" 839 | source = "registry+https://github.com/rust-lang/crates.io-index" 840 | checksum = "501466ecc8a30d1d3b7fc9229b122b2ce8ed6e9d9223f1138d4babb253e51817" 841 | dependencies = [ 842 | "typenum", 843 | "version_check", 844 | ] 845 | 846 | [[package]] 847 | name = "getrandom" 848 | version = "0.1.16" 849 | source = "registry+https://github.com/rust-lang/crates.io-index" 850 | checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" 851 | dependencies = [ 852 | "cfg-if 1.0.0", 853 | "libc", 854 | "wasi 0.9.0+wasi-snapshot-preview1", 855 | ] 856 | 857 | [[package]] 858 | name = "gimli" 859 | version = "0.23.0" 860 | source = "registry+https://github.com/rust-lang/crates.io-index" 861 | checksum = "f6503fe142514ca4799d4c26297c4248239fe8838d827db6bd6065c6ed29a6ce" 862 | 863 | [[package]] 864 | name = "graphql-parser" 865 | version = "0.3.0" 866 | source = "registry+https://github.com/rust-lang/crates.io-index" 867 | checksum = "d1abd4ce5247dfc04a03ccde70f87a048458c9356c7e41d21ad8c407b3dde6f2" 868 | dependencies = [ 869 | "combine", 870 | "thiserror", 871 | ] 872 | 873 | [[package]] 874 | name = "h2" 875 | version = "0.2.7" 876 | source = "registry+https://github.com/rust-lang/crates.io-index" 877 | checksum = "5e4728fd124914ad25e99e3d15a9361a879f6620f63cb56bbb08f95abb97a535" 878 | dependencies = [ 879 | "bytes 0.5.6", 880 | "fnv", 881 | "futures-core", 882 | "futures-sink", 883 | "futures-util", 884 | "http", 885 | "indexmap", 886 | "slab", 887 | "tokio", 888 | "tokio-util", 889 | "tracing", 890 | "tracing-futures", 891 | ] 892 | 893 | [[package]] 894 | name = "hashbrown" 895 | version = "0.9.1" 896 | source = "registry+https://github.com/rust-lang/crates.io-index" 897 | checksum = "d7afe4a420e3fe79967a00898cc1f4db7c8a49a9333a29f8a4bd76a253d5cd04" 898 | 899 | [[package]] 900 | name = "heck" 901 | version = "0.3.2" 902 | source = "registry+https://github.com/rust-lang/crates.io-index" 903 | checksum = "87cbf45460356b7deeb5e3415b5563308c0a9b057c85e12b06ad551f98d0a6ac" 904 | dependencies = [ 905 | "unicode-segmentation", 906 | ] 907 | 908 | [[package]] 909 | name = "hermit-abi" 910 | version = "0.1.18" 911 | source = "registry+https://github.com/rust-lang/crates.io-index" 912 | checksum = "322f4de77956e22ed0e5032c359a0f1273f1f7f0d79bfa3b8ffbc730d7fbcc5c" 913 | dependencies = [ 914 | "libc", 915 | ] 916 | 917 | [[package]] 918 | name = "hex" 919 | version = "0.4.2" 920 | source = "registry+https://github.com/rust-lang/crates.io-index" 921 | checksum = "644f9158b2f133fd50f5fb3242878846d9eb792e445c893805ff0e3824006e35" 922 | 923 | [[package]] 924 | name = "hostname" 925 | version = "0.3.1" 926 | source = "registry+https://github.com/rust-lang/crates.io-index" 927 | checksum = "3c731c3e10504cc8ed35cfe2f1db4c9274c3d35fa486e3b31df46f068ef3e867" 928 | dependencies = [ 929 | "libc", 930 | "match_cfg", 931 | "winapi 0.3.9", 932 | ] 933 | 934 | [[package]] 935 | name = "http" 936 | version = "0.2.3" 937 | source = "registry+https://github.com/rust-lang/crates.io-index" 938 | checksum = "7245cd7449cc792608c3c8a9eaf69bd4eabbabf802713748fd739c98b82f0747" 939 | dependencies = [ 940 | "bytes 1.0.1", 941 | "fnv", 942 | "itoa", 943 | ] 944 | 945 | [[package]] 946 | name = "httparse" 947 | version = "1.3.5" 948 | source = "registry+https://github.com/rust-lang/crates.io-index" 949 | checksum = "615caabe2c3160b313d52ccc905335f4ed5f10881dd63dc5699d47e90be85691" 950 | 951 | [[package]] 952 | name = "humantime" 953 | version = "2.1.0" 954 | source = "registry+https://github.com/rust-lang/crates.io-index" 955 | checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" 956 | 957 | [[package]] 958 | name = "idna" 959 | version = "0.2.1" 960 | source = "registry+https://github.com/rust-lang/crates.io-index" 961 | checksum = "de910d521f7cc3135c4de8db1cb910e0b5ed1dc6f57c381cd07e8e661ce10094" 962 | dependencies = [ 963 | "matches", 964 | "unicode-bidi", 965 | "unicode-normalization", 966 | ] 967 | 968 | [[package]] 969 | name = "indexmap" 970 | version = "1.6.1" 971 | source = "registry+https://github.com/rust-lang/crates.io-index" 972 | checksum = "4fb1fa934250de4de8aef298d81c729a7d33d8c239daa3a7575e6b92bfc7313b" 973 | dependencies = [ 974 | "autocfg", 975 | "hashbrown", 976 | "serde", 977 | ] 978 | 979 | [[package]] 980 | name = "instant" 981 | version = "0.1.9" 982 | source = "registry+https://github.com/rust-lang/crates.io-index" 983 | checksum = "61124eeebbd69b8190558df225adf7e4caafce0d743919e5d6b19652314ec5ec" 984 | dependencies = [ 985 | "cfg-if 1.0.0", 986 | ] 987 | 988 | [[package]] 989 | name = "iovec" 990 | version = "0.1.4" 991 | source = "registry+https://github.com/rust-lang/crates.io-index" 992 | checksum = "b2b3ea6ff95e175473f8ffe6a7eb7c00d054240321b84c57051175fe3c1e075e" 993 | dependencies = [ 994 | "libc", 995 | ] 996 | 997 | [[package]] 998 | name = "ipconfig" 999 | version = "0.2.2" 1000 | source = "registry+https://github.com/rust-lang/crates.io-index" 1001 | checksum = "f7e2f18aece9709094573a9f24f483c4f65caa4298e2f7ae1b71cc65d853fad7" 1002 | dependencies = [ 1003 | "socket2", 1004 | "widestring", 1005 | "winapi 0.3.9", 1006 | "winreg", 1007 | ] 1008 | 1009 | [[package]] 1010 | name = "itoa" 1011 | version = "0.4.7" 1012 | source = "registry+https://github.com/rust-lang/crates.io-index" 1013 | checksum = "dd25036021b0de88a0aff6b850051563c6516d0bf53f8638938edbb9de732736" 1014 | 1015 | [[package]] 1016 | name = "juniper" 1017 | version = "0.15.3" 1018 | source = "registry+https://github.com/rust-lang/crates.io-index" 1019 | checksum = "9ce9122e520b17ce7593f628d2b440318a5fd77b8923b1918e59ec28cf2c2815" 1020 | dependencies = [ 1021 | "async-trait", 1022 | "bson", 1023 | "chrono", 1024 | "fnv", 1025 | "futures", 1026 | "futures-enum", 1027 | "graphql-parser", 1028 | "indexmap", 1029 | "juniper_codegen", 1030 | "serde", 1031 | "static_assertions", 1032 | "url", 1033 | "uuid", 1034 | ] 1035 | 1036 | [[package]] 1037 | name = "juniper_codegen" 1038 | version = "0.15.3" 1039 | source = "registry+https://github.com/rust-lang/crates.io-index" 1040 | checksum = "2aad9bb6febeb76eeb97aa39b1ec4e640ee0eb37db98379f89972b2d0da85d18" 1041 | dependencies = [ 1042 | "proc-macro-error", 1043 | "proc-macro2", 1044 | "quote", 1045 | "syn", 1046 | ] 1047 | 1048 | [[package]] 1049 | name = "kernel32-sys" 1050 | version = "0.2.2" 1051 | source = "registry+https://github.com/rust-lang/crates.io-index" 1052 | checksum = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d" 1053 | dependencies = [ 1054 | "winapi 0.2.8", 1055 | "winapi-build", 1056 | ] 1057 | 1058 | [[package]] 1059 | name = "language-tags" 1060 | version = "0.2.2" 1061 | source = "registry+https://github.com/rust-lang/crates.io-index" 1062 | checksum = "a91d884b6667cd606bb5a69aa0c99ba811a115fc68915e7056ec08a46e93199a" 1063 | 1064 | [[package]] 1065 | name = "lazy_static" 1066 | version = "1.4.0" 1067 | source = "registry+https://github.com/rust-lang/crates.io-index" 1068 | checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" 1069 | 1070 | [[package]] 1071 | name = "libc" 1072 | version = "0.2.85" 1073 | source = "registry+https://github.com/rust-lang/crates.io-index" 1074 | checksum = "7ccac4b00700875e6a07c6cde370d44d32fa01c5a65cdd2fca6858c479d28bb3" 1075 | 1076 | [[package]] 1077 | name = "linked-hash-map" 1078 | version = "0.5.4" 1079 | source = "registry+https://github.com/rust-lang/crates.io-index" 1080 | checksum = "7fb9b38af92608140b86b693604b9ffcc5824240a484d1ecd4795bacb2fe88f3" 1081 | 1082 | [[package]] 1083 | name = "lock_api" 1084 | version = "0.4.2" 1085 | source = "registry+https://github.com/rust-lang/crates.io-index" 1086 | checksum = "dd96ffd135b2fd7b973ac026d28085defbe8983df057ced3eb4f2130b0831312" 1087 | dependencies = [ 1088 | "scopeguard", 1089 | ] 1090 | 1091 | [[package]] 1092 | name = "log" 1093 | version = "0.4.14" 1094 | source = "registry+https://github.com/rust-lang/crates.io-index" 1095 | checksum = "51b9bbe6c47d51fc3e1a9b945965946b4c44142ab8792c50835a980d362c2710" 1096 | dependencies = [ 1097 | "cfg-if 1.0.0", 1098 | ] 1099 | 1100 | [[package]] 1101 | name = "lru-cache" 1102 | version = "0.1.2" 1103 | source = "registry+https://github.com/rust-lang/crates.io-index" 1104 | checksum = "31e24f1ad8321ca0e8a1e0ac13f23cb668e6f5466c2c57319f6a5cf1cc8e3b1c" 1105 | dependencies = [ 1106 | "linked-hash-map", 1107 | ] 1108 | 1109 | [[package]] 1110 | name = "match_cfg" 1111 | version = "0.1.0" 1112 | source = "registry+https://github.com/rust-lang/crates.io-index" 1113 | checksum = "ffbee8634e0d45d258acb448e7eaab3fce7a0a467395d4d9f228e3c1f01fb2e4" 1114 | 1115 | [[package]] 1116 | name = "matches" 1117 | version = "0.1.8" 1118 | source = "registry+https://github.com/rust-lang/crates.io-index" 1119 | checksum = "7ffc5c5338469d4d3ea17d269fa8ea3512ad247247c30bd2df69e68309ed0a08" 1120 | 1121 | [[package]] 1122 | name = "memchr" 1123 | version = "2.3.4" 1124 | source = "registry+https://github.com/rust-lang/crates.io-index" 1125 | checksum = "0ee1c47aaa256ecabcaea351eae4a9b01ef39ed810004e298d2511ed284b1525" 1126 | 1127 | [[package]] 1128 | name = "migrations_internals" 1129 | version = "1.4.1" 1130 | source = "registry+https://github.com/rust-lang/crates.io-index" 1131 | checksum = "2b4fc84e4af020b837029e017966f86a1c2d5e83e64b589963d5047525995860" 1132 | dependencies = [ 1133 | "diesel", 1134 | ] 1135 | 1136 | [[package]] 1137 | name = "migrations_macros" 1138 | version = "1.4.2" 1139 | source = "registry+https://github.com/rust-lang/crates.io-index" 1140 | checksum = "9753f12909fd8d923f75ae5c3258cae1ed3c8ec052e1b38c93c21a6d157f789c" 1141 | dependencies = [ 1142 | "migrations_internals", 1143 | "proc-macro2", 1144 | "quote", 1145 | "syn", 1146 | ] 1147 | 1148 | [[package]] 1149 | name = "mime" 1150 | version = "0.3.16" 1151 | source = "registry+https://github.com/rust-lang/crates.io-index" 1152 | checksum = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d" 1153 | 1154 | [[package]] 1155 | name = "miniz_oxide" 1156 | version = "0.4.3" 1157 | source = "registry+https://github.com/rust-lang/crates.io-index" 1158 | checksum = "0f2d26ec3309788e423cfbf68ad1800f061638098d76a83681af979dc4eda19d" 1159 | dependencies = [ 1160 | "adler", 1161 | "autocfg", 1162 | ] 1163 | 1164 | [[package]] 1165 | name = "mio" 1166 | version = "0.6.23" 1167 | source = "registry+https://github.com/rust-lang/crates.io-index" 1168 | checksum = "4afd66f5b91bf2a3bc13fad0e21caedac168ca4c707504e75585648ae80e4cc4" 1169 | dependencies = [ 1170 | "cfg-if 0.1.10", 1171 | "fuchsia-zircon", 1172 | "fuchsia-zircon-sys", 1173 | "iovec", 1174 | "kernel32-sys", 1175 | "libc", 1176 | "log", 1177 | "miow", 1178 | "net2", 1179 | "slab", 1180 | "winapi 0.2.8", 1181 | ] 1182 | 1183 | [[package]] 1184 | name = "mio-uds" 1185 | version = "0.6.8" 1186 | source = "registry+https://github.com/rust-lang/crates.io-index" 1187 | checksum = "afcb699eb26d4332647cc848492bbc15eafb26f08d0304550d5aa1f612e066f0" 1188 | dependencies = [ 1189 | "iovec", 1190 | "libc", 1191 | "mio", 1192 | ] 1193 | 1194 | [[package]] 1195 | name = "miow" 1196 | version = "0.2.2" 1197 | source = "registry+https://github.com/rust-lang/crates.io-index" 1198 | checksum = "ebd808424166322d4a38da87083bfddd3ac4c131334ed55856112eb06d46944d" 1199 | dependencies = [ 1200 | "kernel32-sys", 1201 | "net2", 1202 | "winapi 0.2.8", 1203 | "ws2_32-sys", 1204 | ] 1205 | 1206 | [[package]] 1207 | name = "net2" 1208 | version = "0.2.37" 1209 | source = "registry+https://github.com/rust-lang/crates.io-index" 1210 | checksum = "391630d12b68002ae1e25e8f974306474966550ad82dac6886fb8910c19568ae" 1211 | dependencies = [ 1212 | "cfg-if 0.1.10", 1213 | "libc", 1214 | "winapi 0.3.9", 1215 | ] 1216 | 1217 | [[package]] 1218 | name = "num-integer" 1219 | version = "0.1.44" 1220 | source = "registry+https://github.com/rust-lang/crates.io-index" 1221 | checksum = "d2cc698a63b549a70bc047073d2949cce27cd1c7b0a4a862d08a8031bc2801db" 1222 | dependencies = [ 1223 | "autocfg", 1224 | "num-traits", 1225 | ] 1226 | 1227 | [[package]] 1228 | name = "num-traits" 1229 | version = "0.2.14" 1230 | source = "registry+https://github.com/rust-lang/crates.io-index" 1231 | checksum = "9a64b1ec5cda2586e284722486d802acf1f7dbdc623e2bfc57e65ca1cd099290" 1232 | dependencies = [ 1233 | "autocfg", 1234 | ] 1235 | 1236 | [[package]] 1237 | name = "num_cpus" 1238 | version = "1.13.0" 1239 | source = "registry+https://github.com/rust-lang/crates.io-index" 1240 | checksum = "05499f3756671c15885fee9034446956fff3f243d6077b91e5767df161f766b3" 1241 | dependencies = [ 1242 | "hermit-abi", 1243 | "libc", 1244 | ] 1245 | 1246 | [[package]] 1247 | name = "object" 1248 | version = "0.23.0" 1249 | source = "registry+https://github.com/rust-lang/crates.io-index" 1250 | checksum = "a9a7ab5d64814df0fe4a4b5ead45ed6c5f181ee3ff04ba344313a6c80446c5d4" 1251 | 1252 | [[package]] 1253 | name = "once_cell" 1254 | version = "1.5.2" 1255 | source = "registry+https://github.com/rust-lang/crates.io-index" 1256 | checksum = "13bd41f508810a131401606d54ac32a467c97172d74ba7662562ebba5ad07fa0" 1257 | 1258 | [[package]] 1259 | name = "opaque-debug" 1260 | version = "0.3.0" 1261 | source = "registry+https://github.com/rust-lang/crates.io-index" 1262 | checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" 1263 | 1264 | [[package]] 1265 | name = "parking_lot" 1266 | version = "0.11.1" 1267 | source = "registry+https://github.com/rust-lang/crates.io-index" 1268 | checksum = "6d7744ac029df22dca6284efe4e898991d28e3085c706c972bcd7da4a27a15eb" 1269 | dependencies = [ 1270 | "instant", 1271 | "lock_api", 1272 | "parking_lot_core", 1273 | ] 1274 | 1275 | [[package]] 1276 | name = "parking_lot_core" 1277 | version = "0.8.2" 1278 | source = "registry+https://github.com/rust-lang/crates.io-index" 1279 | checksum = "9ccb628cad4f84851442432c60ad8e1f607e29752d0bf072cbd0baf28aa34272" 1280 | dependencies = [ 1281 | "cfg-if 1.0.0", 1282 | "instant", 1283 | "libc", 1284 | "redox_syscall", 1285 | "smallvec", 1286 | "winapi 0.3.9", 1287 | ] 1288 | 1289 | [[package]] 1290 | name = "percent-encoding" 1291 | version = "2.1.0" 1292 | source = "registry+https://github.com/rust-lang/crates.io-index" 1293 | checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e" 1294 | 1295 | [[package]] 1296 | name = "pin-project" 1297 | version = "0.4.27" 1298 | source = "registry+https://github.com/rust-lang/crates.io-index" 1299 | checksum = "2ffbc8e94b38ea3d2d8ba92aea2983b503cd75d0888d75b86bb37970b5698e15" 1300 | dependencies = [ 1301 | "pin-project-internal 0.4.27", 1302 | ] 1303 | 1304 | [[package]] 1305 | name = "pin-project" 1306 | version = "1.0.5" 1307 | source = "registry+https://github.com/rust-lang/crates.io-index" 1308 | checksum = "96fa8ebb90271c4477f144354485b8068bd8f6b78b428b01ba892ca26caf0b63" 1309 | dependencies = [ 1310 | "pin-project-internal 1.0.5", 1311 | ] 1312 | 1313 | [[package]] 1314 | name = "pin-project-internal" 1315 | version = "0.4.27" 1316 | source = "registry+https://github.com/rust-lang/crates.io-index" 1317 | checksum = "65ad2ae56b6abe3a1ee25f15ee605bacadb9a764edaba9c2bf4103800d4a1895" 1318 | dependencies = [ 1319 | "proc-macro2", 1320 | "quote", 1321 | "syn", 1322 | ] 1323 | 1324 | [[package]] 1325 | name = "pin-project-internal" 1326 | version = "1.0.5" 1327 | source = "registry+https://github.com/rust-lang/crates.io-index" 1328 | checksum = "758669ae3558c6f74bd2a18b41f7ac0b5a195aea6639d6a9b5e5d1ad5ba24c0b" 1329 | dependencies = [ 1330 | "proc-macro2", 1331 | "quote", 1332 | "syn", 1333 | ] 1334 | 1335 | [[package]] 1336 | name = "pin-project-lite" 1337 | version = "0.1.11" 1338 | source = "registry+https://github.com/rust-lang/crates.io-index" 1339 | checksum = "c917123afa01924fc84bb20c4c03f004d9c38e5127e3c039bbf7f4b9c76a2f6b" 1340 | 1341 | [[package]] 1342 | name = "pin-project-lite" 1343 | version = "0.2.4" 1344 | source = "registry+https://github.com/rust-lang/crates.io-index" 1345 | checksum = "439697af366c49a6d0a010c56a0d97685bc140ce0d377b13a2ea2aa42d64a827" 1346 | 1347 | [[package]] 1348 | name = "pin-utils" 1349 | version = "0.1.0" 1350 | source = "registry+https://github.com/rust-lang/crates.io-index" 1351 | checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" 1352 | 1353 | [[package]] 1354 | name = "ppv-lite86" 1355 | version = "0.2.10" 1356 | source = "registry+https://github.com/rust-lang/crates.io-index" 1357 | checksum = "ac74c624d6b2d21f425f752262f42188365d7b8ff1aff74c82e45136510a4857" 1358 | 1359 | [[package]] 1360 | name = "pq-sys" 1361 | version = "0.4.6" 1362 | source = "registry+https://github.com/rust-lang/crates.io-index" 1363 | checksum = "6ac25eee5a0582f45a67e837e350d784e7003bd29a5f460796772061ca49ffda" 1364 | dependencies = [ 1365 | "vcpkg", 1366 | ] 1367 | 1368 | [[package]] 1369 | name = "proc-macro-error" 1370 | version = "1.0.4" 1371 | source = "registry+https://github.com/rust-lang/crates.io-index" 1372 | checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" 1373 | dependencies = [ 1374 | "proc-macro-error-attr", 1375 | "proc-macro2", 1376 | "quote", 1377 | "syn", 1378 | "version_check", 1379 | ] 1380 | 1381 | [[package]] 1382 | name = "proc-macro-error-attr" 1383 | version = "1.0.4" 1384 | source = "registry+https://github.com/rust-lang/crates.io-index" 1385 | checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" 1386 | dependencies = [ 1387 | "proc-macro2", 1388 | "quote", 1389 | "version_check", 1390 | ] 1391 | 1392 | [[package]] 1393 | name = "proc-macro-hack" 1394 | version = "0.5.19" 1395 | source = "registry+https://github.com/rust-lang/crates.io-index" 1396 | checksum = "dbf0c48bc1d91375ae5c3cd81e3722dff1abcf81a30960240640d223f59fe0e5" 1397 | 1398 | [[package]] 1399 | name = "proc-macro-nested" 1400 | version = "0.1.7" 1401 | source = "registry+https://github.com/rust-lang/crates.io-index" 1402 | checksum = "bc881b2c22681370c6a780e47af9840ef841837bc98118431d4e1868bd0c1086" 1403 | 1404 | [[package]] 1405 | name = "proc-macro2" 1406 | version = "1.0.24" 1407 | source = "registry+https://github.com/rust-lang/crates.io-index" 1408 | checksum = "1e0704ee1a7e00d7bb417d0770ea303c1bccbabf0ef1667dae92b5967f5f8a71" 1409 | dependencies = [ 1410 | "unicode-xid", 1411 | ] 1412 | 1413 | [[package]] 1414 | name = "quick-error" 1415 | version = "1.2.3" 1416 | source = "registry+https://github.com/rust-lang/crates.io-index" 1417 | checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" 1418 | 1419 | [[package]] 1420 | name = "quote" 1421 | version = "1.0.8" 1422 | source = "registry+https://github.com/rust-lang/crates.io-index" 1423 | checksum = "991431c3519a3f36861882da93630ce66b52918dcf1b8e2fd66b397fc96f28df" 1424 | dependencies = [ 1425 | "proc-macro2", 1426 | ] 1427 | 1428 | [[package]] 1429 | name = "r2d2" 1430 | version = "0.8.9" 1431 | source = "registry+https://github.com/rust-lang/crates.io-index" 1432 | checksum = "545c5bc2b880973c9c10e4067418407a0ccaa3091781d1671d46eb35107cb26f" 1433 | dependencies = [ 1434 | "log", 1435 | "parking_lot", 1436 | "scheduled-thread-pool", 1437 | ] 1438 | 1439 | [[package]] 1440 | name = "rand" 1441 | version = "0.7.3" 1442 | source = "registry+https://github.com/rust-lang/crates.io-index" 1443 | checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" 1444 | dependencies = [ 1445 | "getrandom", 1446 | "libc", 1447 | "rand_chacha", 1448 | "rand_core", 1449 | "rand_hc", 1450 | ] 1451 | 1452 | [[package]] 1453 | name = "rand_chacha" 1454 | version = "0.2.2" 1455 | source = "registry+https://github.com/rust-lang/crates.io-index" 1456 | checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" 1457 | dependencies = [ 1458 | "ppv-lite86", 1459 | "rand_core", 1460 | ] 1461 | 1462 | [[package]] 1463 | name = "rand_core" 1464 | version = "0.5.1" 1465 | source = "registry+https://github.com/rust-lang/crates.io-index" 1466 | checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" 1467 | dependencies = [ 1468 | "getrandom", 1469 | ] 1470 | 1471 | [[package]] 1472 | name = "rand_hc" 1473 | version = "0.2.0" 1474 | source = "registry+https://github.com/rust-lang/crates.io-index" 1475 | checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" 1476 | dependencies = [ 1477 | "rand_core", 1478 | ] 1479 | 1480 | [[package]] 1481 | name = "redox_syscall" 1482 | version = "0.1.57" 1483 | source = "registry+https://github.com/rust-lang/crates.io-index" 1484 | checksum = "41cc0f7e4d5d4544e8861606a285bb08d3e70712ccc7d2b84d7c0ccfaf4b05ce" 1485 | 1486 | [[package]] 1487 | name = "regex" 1488 | version = "1.4.3" 1489 | source = "registry+https://github.com/rust-lang/crates.io-index" 1490 | checksum = "d9251239e129e16308e70d853559389de218ac275b515068abc96829d05b948a" 1491 | dependencies = [ 1492 | "aho-corasick", 1493 | "memchr", 1494 | "regex-syntax", 1495 | "thread_local", 1496 | ] 1497 | 1498 | [[package]] 1499 | name = "regex-syntax" 1500 | version = "0.6.22" 1501 | source = "registry+https://github.com/rust-lang/crates.io-index" 1502 | checksum = "b5eb417147ba9860a96cfe72a0b93bf88fee1744b5636ec99ab20c1aa9376581" 1503 | 1504 | [[package]] 1505 | name = "resolv-conf" 1506 | version = "0.7.0" 1507 | source = "registry+https://github.com/rust-lang/crates.io-index" 1508 | checksum = "52e44394d2086d010551b14b53b1f24e31647570cd1deb0379e2c21b329aba00" 1509 | dependencies = [ 1510 | "hostname", 1511 | "quick-error", 1512 | ] 1513 | 1514 | [[package]] 1515 | name = "rust-graphql-actix-juniper-diesel-example" 1516 | version = "0.2.0" 1517 | dependencies = [ 1518 | "actix-cors", 1519 | "actix-http", 1520 | "actix-rt", 1521 | "actix-web", 1522 | "chrono", 1523 | "diesel", 1524 | "diesel_migrations", 1525 | "dotenv", 1526 | "env_logger", 1527 | "futures", 1528 | "juniper", 1529 | "serde", 1530 | "serde_derive", 1531 | "serde_json", 1532 | "serial_test", 1533 | ] 1534 | 1535 | [[package]] 1536 | name = "rustc-demangle" 1537 | version = "0.1.18" 1538 | source = "registry+https://github.com/rust-lang/crates.io-index" 1539 | checksum = "6e3bad0ee36814ca07d7968269dd4b7ec89ec2da10c4bb613928d3077083c232" 1540 | 1541 | [[package]] 1542 | name = "rustc_version" 1543 | version = "0.2.3" 1544 | source = "registry+https://github.com/rust-lang/crates.io-index" 1545 | checksum = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" 1546 | dependencies = [ 1547 | "semver", 1548 | ] 1549 | 1550 | [[package]] 1551 | name = "ryu" 1552 | version = "1.0.5" 1553 | source = "registry+https://github.com/rust-lang/crates.io-index" 1554 | checksum = "71d301d4193d031abdd79ff7e3dd721168a9572ef3fe51a1517aba235bd8f86e" 1555 | 1556 | [[package]] 1557 | name = "scheduled-thread-pool" 1558 | version = "0.2.5" 1559 | source = "registry+https://github.com/rust-lang/crates.io-index" 1560 | checksum = "dc6f74fd1204073fa02d5d5d68bec8021be4c38690b61264b2fdb48083d0e7d7" 1561 | dependencies = [ 1562 | "parking_lot", 1563 | ] 1564 | 1565 | [[package]] 1566 | name = "scopeguard" 1567 | version = "1.1.0" 1568 | source = "registry+https://github.com/rust-lang/crates.io-index" 1569 | checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" 1570 | 1571 | [[package]] 1572 | name = "semver" 1573 | version = "0.9.0" 1574 | source = "registry+https://github.com/rust-lang/crates.io-index" 1575 | checksum = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" 1576 | dependencies = [ 1577 | "semver-parser", 1578 | ] 1579 | 1580 | [[package]] 1581 | name = "semver-parser" 1582 | version = "0.7.0" 1583 | source = "registry+https://github.com/rust-lang/crates.io-index" 1584 | checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" 1585 | 1586 | [[package]] 1587 | name = "serde" 1588 | version = "1.0.123" 1589 | source = "registry+https://github.com/rust-lang/crates.io-index" 1590 | checksum = "92d5161132722baa40d802cc70b15262b98258453e85e5d1d365c757c73869ae" 1591 | dependencies = [ 1592 | "serde_derive", 1593 | ] 1594 | 1595 | [[package]] 1596 | name = "serde_derive" 1597 | version = "1.0.123" 1598 | source = "registry+https://github.com/rust-lang/crates.io-index" 1599 | checksum = "9391c295d64fc0abb2c556bad848f33cb8296276b1ad2677d1ae1ace4f258f31" 1600 | dependencies = [ 1601 | "proc-macro2", 1602 | "quote", 1603 | "syn", 1604 | ] 1605 | 1606 | [[package]] 1607 | name = "serde_json" 1608 | version = "1.0.61" 1609 | source = "registry+https://github.com/rust-lang/crates.io-index" 1610 | checksum = "4fceb2595057b6891a4ee808f70054bd2d12f0e97f1cbb78689b59f676df325a" 1611 | dependencies = [ 1612 | "indexmap", 1613 | "itoa", 1614 | "ryu", 1615 | "serde", 1616 | ] 1617 | 1618 | [[package]] 1619 | name = "serde_urlencoded" 1620 | version = "0.7.0" 1621 | source = "registry+https://github.com/rust-lang/crates.io-index" 1622 | checksum = "edfa57a7f8d9c1d260a549e7224100f6c43d43f9103e06dd8b4095a9b2b43ce9" 1623 | dependencies = [ 1624 | "form_urlencoded", 1625 | "itoa", 1626 | "ryu", 1627 | "serde", 1628 | ] 1629 | 1630 | [[package]] 1631 | name = "serial_test" 1632 | version = "0.5.1" 1633 | source = "registry+https://github.com/rust-lang/crates.io-index" 1634 | checksum = "e0bccbcf40c8938196944a3da0e133e031a33f4d6b72db3bda3cc556e361905d" 1635 | dependencies = [ 1636 | "lazy_static", 1637 | "parking_lot", 1638 | "serial_test_derive", 1639 | ] 1640 | 1641 | [[package]] 1642 | name = "serial_test_derive" 1643 | version = "0.5.1" 1644 | source = "registry+https://github.com/rust-lang/crates.io-index" 1645 | checksum = "b2acd6defeddb41eb60bb468f8825d0cfd0c2a76bc03bfd235b6a1dc4f6a1ad5" 1646 | dependencies = [ 1647 | "proc-macro2", 1648 | "quote", 1649 | "syn", 1650 | ] 1651 | 1652 | [[package]] 1653 | name = "sha-1" 1654 | version = "0.9.3" 1655 | source = "registry+https://github.com/rust-lang/crates.io-index" 1656 | checksum = "f4b312c3731e3fe78a185e6b9b911a7aa715b8e31cce117975219aab2acf285d" 1657 | dependencies = [ 1658 | "block-buffer", 1659 | "cfg-if 1.0.0", 1660 | "cpuid-bool", 1661 | "digest", 1662 | "opaque-debug", 1663 | ] 1664 | 1665 | [[package]] 1666 | name = "sha1" 1667 | version = "0.6.0" 1668 | source = "registry+https://github.com/rust-lang/crates.io-index" 1669 | checksum = "2579985fda508104f7587689507983eadd6a6e84dd35d6d115361f530916fa0d" 1670 | 1671 | [[package]] 1672 | name = "signal-hook-registry" 1673 | version = "1.3.0" 1674 | source = "registry+https://github.com/rust-lang/crates.io-index" 1675 | checksum = "16f1d0fef1604ba8f7a073c7e701f213e056707210e9020af4528e0101ce11a6" 1676 | dependencies = [ 1677 | "libc", 1678 | ] 1679 | 1680 | [[package]] 1681 | name = "slab" 1682 | version = "0.4.2" 1683 | source = "registry+https://github.com/rust-lang/crates.io-index" 1684 | checksum = "c111b5bd5695e56cffe5129854aa230b39c93a305372fdbb2668ca2394eea9f8" 1685 | 1686 | [[package]] 1687 | name = "smallvec" 1688 | version = "1.6.1" 1689 | source = "registry+https://github.com/rust-lang/crates.io-index" 1690 | checksum = "fe0f37c9e8f3c5a4a66ad655a93c74daac4ad00c441533bf5c6e7990bb42604e" 1691 | 1692 | [[package]] 1693 | name = "socket2" 1694 | version = "0.3.19" 1695 | source = "registry+https://github.com/rust-lang/crates.io-index" 1696 | checksum = "122e570113d28d773067fab24266b66753f6ea915758651696b6e35e49f88d6e" 1697 | dependencies = [ 1698 | "cfg-if 1.0.0", 1699 | "libc", 1700 | "winapi 0.3.9", 1701 | ] 1702 | 1703 | [[package]] 1704 | name = "standback" 1705 | version = "0.2.15" 1706 | source = "registry+https://github.com/rust-lang/crates.io-index" 1707 | checksum = "a2beb4d1860a61f571530b3f855a1b538d0200f7871c63331ecd6f17b1f014f8" 1708 | dependencies = [ 1709 | "version_check", 1710 | ] 1711 | 1712 | [[package]] 1713 | name = "static_assertions" 1714 | version = "1.1.0" 1715 | source = "registry+https://github.com/rust-lang/crates.io-index" 1716 | checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" 1717 | 1718 | [[package]] 1719 | name = "stdweb" 1720 | version = "0.4.20" 1721 | source = "registry+https://github.com/rust-lang/crates.io-index" 1722 | checksum = "d022496b16281348b52d0e30ae99e01a73d737b2f45d38fed4edf79f9325a1d5" 1723 | dependencies = [ 1724 | "discard", 1725 | "rustc_version", 1726 | "stdweb-derive", 1727 | "stdweb-internal-macros", 1728 | "stdweb-internal-runtime", 1729 | "wasm-bindgen", 1730 | ] 1731 | 1732 | [[package]] 1733 | name = "stdweb-derive" 1734 | version = "0.5.3" 1735 | source = "registry+https://github.com/rust-lang/crates.io-index" 1736 | checksum = "c87a60a40fccc84bef0652345bbbbbe20a605bf5d0ce81719fc476f5c03b50ef" 1737 | dependencies = [ 1738 | "proc-macro2", 1739 | "quote", 1740 | "serde", 1741 | "serde_derive", 1742 | "syn", 1743 | ] 1744 | 1745 | [[package]] 1746 | name = "stdweb-internal-macros" 1747 | version = "0.2.9" 1748 | source = "registry+https://github.com/rust-lang/crates.io-index" 1749 | checksum = "58fa5ff6ad0d98d1ffa8cb115892b6e69d67799f6763e162a1c9db421dc22e11" 1750 | dependencies = [ 1751 | "base-x", 1752 | "proc-macro2", 1753 | "quote", 1754 | "serde", 1755 | "serde_derive", 1756 | "serde_json", 1757 | "sha1", 1758 | "syn", 1759 | ] 1760 | 1761 | [[package]] 1762 | name = "stdweb-internal-runtime" 1763 | version = "0.1.5" 1764 | source = "registry+https://github.com/rust-lang/crates.io-index" 1765 | checksum = "213701ba3370744dcd1a12960caa4843b3d68b4d1c0a5d575e0d65b2ee9d16c0" 1766 | 1767 | [[package]] 1768 | name = "syn" 1769 | version = "1.0.60" 1770 | source = "registry+https://github.com/rust-lang/crates.io-index" 1771 | checksum = "c700597eca8a5a762beb35753ef6b94df201c81cca676604f547495a0d7f0081" 1772 | dependencies = [ 1773 | "proc-macro2", 1774 | "quote", 1775 | "unicode-xid", 1776 | ] 1777 | 1778 | [[package]] 1779 | name = "termcolor" 1780 | version = "1.1.2" 1781 | source = "registry+https://github.com/rust-lang/crates.io-index" 1782 | checksum = "2dfed899f0eb03f32ee8c6a0aabdb8a7949659e3466561fc0adf54e26d88c5f4" 1783 | dependencies = [ 1784 | "winapi-util", 1785 | ] 1786 | 1787 | [[package]] 1788 | name = "thiserror" 1789 | version = "1.0.23" 1790 | source = "registry+https://github.com/rust-lang/crates.io-index" 1791 | checksum = "76cc616c6abf8c8928e2fdcc0dbfab37175edd8fb49a4641066ad1364fdab146" 1792 | dependencies = [ 1793 | "thiserror-impl", 1794 | ] 1795 | 1796 | [[package]] 1797 | name = "thiserror-impl" 1798 | version = "1.0.23" 1799 | source = "registry+https://github.com/rust-lang/crates.io-index" 1800 | checksum = "9be73a2caec27583d0046ef3796c3794f868a5bc813db689eed00c7631275cd1" 1801 | dependencies = [ 1802 | "proc-macro2", 1803 | "quote", 1804 | "syn", 1805 | ] 1806 | 1807 | [[package]] 1808 | name = "thread_local" 1809 | version = "1.1.3" 1810 | source = "registry+https://github.com/rust-lang/crates.io-index" 1811 | checksum = "8018d24e04c95ac8790716a5987d0fec4f8b27249ffa0f7d33f1369bdfb88cbd" 1812 | dependencies = [ 1813 | "once_cell", 1814 | ] 1815 | 1816 | [[package]] 1817 | name = "threadpool" 1818 | version = "1.8.1" 1819 | source = "registry+https://github.com/rust-lang/crates.io-index" 1820 | checksum = "d050e60b33d41c19108b32cea32164033a9013fe3b46cbd4457559bfbf77afaa" 1821 | dependencies = [ 1822 | "num_cpus", 1823 | ] 1824 | 1825 | [[package]] 1826 | name = "time" 1827 | version = "0.1.44" 1828 | source = "registry+https://github.com/rust-lang/crates.io-index" 1829 | checksum = "6db9e6914ab8b1ae1c260a4ae7a49b6c5611b40328a735b21862567685e73255" 1830 | dependencies = [ 1831 | "libc", 1832 | "wasi 0.10.0+wasi-snapshot-preview1", 1833 | "winapi 0.3.9", 1834 | ] 1835 | 1836 | [[package]] 1837 | name = "time" 1838 | version = "0.2.25" 1839 | source = "registry+https://github.com/rust-lang/crates.io-index" 1840 | checksum = "1195b046942c221454c2539395f85413b33383a067449d78aab2b7b052a142f7" 1841 | dependencies = [ 1842 | "const_fn", 1843 | "libc", 1844 | "standback", 1845 | "stdweb", 1846 | "time-macros", 1847 | "version_check", 1848 | "winapi 0.3.9", 1849 | ] 1850 | 1851 | [[package]] 1852 | name = "time-macros" 1853 | version = "0.1.1" 1854 | source = "registry+https://github.com/rust-lang/crates.io-index" 1855 | checksum = "957e9c6e26f12cb6d0dd7fc776bb67a706312e7299aed74c8dd5b17ebb27e2f1" 1856 | dependencies = [ 1857 | "proc-macro-hack", 1858 | "time-macros-impl", 1859 | ] 1860 | 1861 | [[package]] 1862 | name = "time-macros-impl" 1863 | version = "0.1.1" 1864 | source = "registry+https://github.com/rust-lang/crates.io-index" 1865 | checksum = "e5c3be1edfad6027c69f5491cf4cb310d1a71ecd6af742788c6ff8bced86b8fa" 1866 | dependencies = [ 1867 | "proc-macro-hack", 1868 | "proc-macro2", 1869 | "quote", 1870 | "standback", 1871 | "syn", 1872 | ] 1873 | 1874 | [[package]] 1875 | name = "tinyvec" 1876 | version = "1.1.1" 1877 | source = "registry+https://github.com/rust-lang/crates.io-index" 1878 | checksum = "317cca572a0e89c3ce0ca1f1bdc9369547fe318a683418e42ac8f59d14701023" 1879 | dependencies = [ 1880 | "tinyvec_macros", 1881 | ] 1882 | 1883 | [[package]] 1884 | name = "tinyvec_macros" 1885 | version = "0.1.0" 1886 | source = "registry+https://github.com/rust-lang/crates.io-index" 1887 | checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" 1888 | 1889 | [[package]] 1890 | name = "tokio" 1891 | version = "0.2.25" 1892 | source = "registry+https://github.com/rust-lang/crates.io-index" 1893 | checksum = "6703a273949a90131b290be1fe7b039d0fc884aa1935860dfcbe056f28cd8092" 1894 | dependencies = [ 1895 | "bytes 0.5.6", 1896 | "futures-core", 1897 | "iovec", 1898 | "lazy_static", 1899 | "libc", 1900 | "memchr", 1901 | "mio", 1902 | "mio-uds", 1903 | "pin-project-lite 0.1.11", 1904 | "signal-hook-registry", 1905 | "slab", 1906 | "winapi 0.3.9", 1907 | ] 1908 | 1909 | [[package]] 1910 | name = "tokio-util" 1911 | version = "0.3.1" 1912 | source = "registry+https://github.com/rust-lang/crates.io-index" 1913 | checksum = "be8242891f2b6cbef26a2d7e8605133c2c554cd35b3e4948ea892d6d68436499" 1914 | dependencies = [ 1915 | "bytes 0.5.6", 1916 | "futures-core", 1917 | "futures-sink", 1918 | "log", 1919 | "pin-project-lite 0.1.11", 1920 | "tokio", 1921 | ] 1922 | 1923 | [[package]] 1924 | name = "tracing" 1925 | version = "0.1.23" 1926 | source = "registry+https://github.com/rust-lang/crates.io-index" 1927 | checksum = "f7d40a22fd029e33300d8d89a5cc8ffce18bb7c587662f54629e94c9de5487f3" 1928 | dependencies = [ 1929 | "cfg-if 1.0.0", 1930 | "log", 1931 | "pin-project-lite 0.2.4", 1932 | "tracing-core", 1933 | ] 1934 | 1935 | [[package]] 1936 | name = "tracing-core" 1937 | version = "0.1.17" 1938 | source = "registry+https://github.com/rust-lang/crates.io-index" 1939 | checksum = "f50de3927f93d202783f4513cda820ab47ef17f624b03c096e86ef00c67e6b5f" 1940 | dependencies = [ 1941 | "lazy_static", 1942 | ] 1943 | 1944 | [[package]] 1945 | name = "tracing-futures" 1946 | version = "0.2.4" 1947 | source = "registry+https://github.com/rust-lang/crates.io-index" 1948 | checksum = "ab7bb6f14721aa00656086e9335d363c5c8747bae02ebe32ea2c7dece5689b4c" 1949 | dependencies = [ 1950 | "pin-project 0.4.27", 1951 | "tracing", 1952 | ] 1953 | 1954 | [[package]] 1955 | name = "trust-dns-proto" 1956 | version = "0.19.6" 1957 | source = "registry+https://github.com/rust-lang/crates.io-index" 1958 | checksum = "53861fcb288a166aae4c508ae558ed18b53838db728d4d310aad08270a7d4c2b" 1959 | dependencies = [ 1960 | "async-trait", 1961 | "backtrace", 1962 | "enum-as-inner", 1963 | "futures", 1964 | "idna", 1965 | "lazy_static", 1966 | "log", 1967 | "rand", 1968 | "smallvec", 1969 | "thiserror", 1970 | "tokio", 1971 | "url", 1972 | ] 1973 | 1974 | [[package]] 1975 | name = "trust-dns-resolver" 1976 | version = "0.19.6" 1977 | source = "registry+https://github.com/rust-lang/crates.io-index" 1978 | checksum = "6759e8efc40465547b0dfce9500d733c65f969a4cbbfbe3ccf68daaa46ef179e" 1979 | dependencies = [ 1980 | "backtrace", 1981 | "cfg-if 0.1.10", 1982 | "futures", 1983 | "ipconfig", 1984 | "lazy_static", 1985 | "log", 1986 | "lru-cache", 1987 | "resolv-conf", 1988 | "smallvec", 1989 | "thiserror", 1990 | "tokio", 1991 | "trust-dns-proto", 1992 | ] 1993 | 1994 | [[package]] 1995 | name = "typenum" 1996 | version = "1.12.0" 1997 | source = "registry+https://github.com/rust-lang/crates.io-index" 1998 | checksum = "373c8a200f9e67a0c95e62a4f52fbf80c23b4381c05a17845531982fa99e6b33" 1999 | 2000 | [[package]] 2001 | name = "unicode-bidi" 2002 | version = "0.3.4" 2003 | source = "registry+https://github.com/rust-lang/crates.io-index" 2004 | checksum = "49f2bd0c6468a8230e1db229cff8029217cf623c767ea5d60bfbd42729ea54d5" 2005 | dependencies = [ 2006 | "matches", 2007 | ] 2008 | 2009 | [[package]] 2010 | name = "unicode-normalization" 2011 | version = "0.1.16" 2012 | source = "registry+https://github.com/rust-lang/crates.io-index" 2013 | checksum = "a13e63ab62dbe32aeee58d1c5408d35c36c392bba5d9d3142287219721afe606" 2014 | dependencies = [ 2015 | "tinyvec", 2016 | ] 2017 | 2018 | [[package]] 2019 | name = "unicode-segmentation" 2020 | version = "1.7.1" 2021 | source = "registry+https://github.com/rust-lang/crates.io-index" 2022 | checksum = "bb0d2e7be6ae3a5fa87eed5fb451aff96f2573d2694942e40543ae0bbe19c796" 2023 | 2024 | [[package]] 2025 | name = "unicode-xid" 2026 | version = "0.2.1" 2027 | source = "registry+https://github.com/rust-lang/crates.io-index" 2028 | checksum = "f7fe0bb3479651439c9112f72b6c505038574c9fbb575ed1bf3b797fa39dd564" 2029 | 2030 | [[package]] 2031 | name = "unreachable" 2032 | version = "1.0.0" 2033 | source = "registry+https://github.com/rust-lang/crates.io-index" 2034 | checksum = "382810877fe448991dfc7f0dd6e3ae5d58088fd0ea5e35189655f84e6814fa56" 2035 | dependencies = [ 2036 | "void", 2037 | ] 2038 | 2039 | [[package]] 2040 | name = "url" 2041 | version = "2.2.0" 2042 | source = "registry+https://github.com/rust-lang/crates.io-index" 2043 | checksum = "5909f2b0817350449ed73e8bcd81c8c3c8d9a7a5d8acba4b27db277f1868976e" 2044 | dependencies = [ 2045 | "form_urlencoded", 2046 | "idna", 2047 | "matches", 2048 | "percent-encoding", 2049 | ] 2050 | 2051 | [[package]] 2052 | name = "uuid" 2053 | version = "0.8.2" 2054 | source = "registry+https://github.com/rust-lang/crates.io-index" 2055 | checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7" 2056 | 2057 | [[package]] 2058 | name = "vcpkg" 2059 | version = "0.2.11" 2060 | source = "registry+https://github.com/rust-lang/crates.io-index" 2061 | checksum = "b00bca6106a5e23f3eee943593759b7fcddb00554332e856d990c893966879fb" 2062 | 2063 | [[package]] 2064 | name = "version_check" 2065 | version = "0.9.2" 2066 | source = "registry+https://github.com/rust-lang/crates.io-index" 2067 | checksum = "b5a972e5669d67ba988ce3dc826706fb0a8b01471c088cb0b6110b805cc36aed" 2068 | 2069 | [[package]] 2070 | name = "void" 2071 | version = "1.0.2" 2072 | source = "registry+https://github.com/rust-lang/crates.io-index" 2073 | checksum = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" 2074 | 2075 | [[package]] 2076 | name = "wasi" 2077 | version = "0.9.0+wasi-snapshot-preview1" 2078 | source = "registry+https://github.com/rust-lang/crates.io-index" 2079 | checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" 2080 | 2081 | [[package]] 2082 | name = "wasi" 2083 | version = "0.10.0+wasi-snapshot-preview1" 2084 | source = "registry+https://github.com/rust-lang/crates.io-index" 2085 | checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f" 2086 | 2087 | [[package]] 2088 | name = "wasm-bindgen" 2089 | version = "0.2.70" 2090 | source = "registry+https://github.com/rust-lang/crates.io-index" 2091 | checksum = "55c0f7123de74f0dab9b7d00fd614e7b19349cd1e2f5252bbe9b1754b59433be" 2092 | dependencies = [ 2093 | "cfg-if 1.0.0", 2094 | "wasm-bindgen-macro", 2095 | ] 2096 | 2097 | [[package]] 2098 | name = "wasm-bindgen-backend" 2099 | version = "0.2.70" 2100 | source = "registry+https://github.com/rust-lang/crates.io-index" 2101 | checksum = "7bc45447f0d4573f3d65720f636bbcc3dd6ce920ed704670118650bcd47764c7" 2102 | dependencies = [ 2103 | "bumpalo", 2104 | "lazy_static", 2105 | "log", 2106 | "proc-macro2", 2107 | "quote", 2108 | "syn", 2109 | "wasm-bindgen-shared", 2110 | ] 2111 | 2112 | [[package]] 2113 | name = "wasm-bindgen-macro" 2114 | version = "0.2.70" 2115 | source = "registry+https://github.com/rust-lang/crates.io-index" 2116 | checksum = "3b8853882eef39593ad4174dd26fc9865a64e84026d223f63bb2c42affcbba2c" 2117 | dependencies = [ 2118 | "quote", 2119 | "wasm-bindgen-macro-support", 2120 | ] 2121 | 2122 | [[package]] 2123 | name = "wasm-bindgen-macro-support" 2124 | version = "0.2.70" 2125 | source = "registry+https://github.com/rust-lang/crates.io-index" 2126 | checksum = "4133b5e7f2a531fa413b3a1695e925038a05a71cf67e87dafa295cb645a01385" 2127 | dependencies = [ 2128 | "proc-macro2", 2129 | "quote", 2130 | "syn", 2131 | "wasm-bindgen-backend", 2132 | "wasm-bindgen-shared", 2133 | ] 2134 | 2135 | [[package]] 2136 | name = "wasm-bindgen-shared" 2137 | version = "0.2.70" 2138 | source = "registry+https://github.com/rust-lang/crates.io-index" 2139 | checksum = "dd4945e4943ae02d15c13962b38a5b1e81eadd4b71214eee75af64a4d6a4fd64" 2140 | 2141 | [[package]] 2142 | name = "widestring" 2143 | version = "0.4.3" 2144 | source = "registry+https://github.com/rust-lang/crates.io-index" 2145 | checksum = "c168940144dd21fd8046987c16a46a33d5fc84eec29ef9dcddc2ac9e31526b7c" 2146 | 2147 | [[package]] 2148 | name = "winapi" 2149 | version = "0.2.8" 2150 | source = "registry+https://github.com/rust-lang/crates.io-index" 2151 | checksum = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a" 2152 | 2153 | [[package]] 2154 | name = "winapi" 2155 | version = "0.3.9" 2156 | source = "registry+https://github.com/rust-lang/crates.io-index" 2157 | checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" 2158 | dependencies = [ 2159 | "winapi-i686-pc-windows-gnu", 2160 | "winapi-x86_64-pc-windows-gnu", 2161 | ] 2162 | 2163 | [[package]] 2164 | name = "winapi-build" 2165 | version = "0.1.1" 2166 | source = "registry+https://github.com/rust-lang/crates.io-index" 2167 | checksum = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc" 2168 | 2169 | [[package]] 2170 | name = "winapi-i686-pc-windows-gnu" 2171 | version = "0.4.0" 2172 | source = "registry+https://github.com/rust-lang/crates.io-index" 2173 | checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" 2174 | 2175 | [[package]] 2176 | name = "winapi-util" 2177 | version = "0.1.5" 2178 | source = "registry+https://github.com/rust-lang/crates.io-index" 2179 | checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" 2180 | dependencies = [ 2181 | "winapi 0.3.9", 2182 | ] 2183 | 2184 | [[package]] 2185 | name = "winapi-x86_64-pc-windows-gnu" 2186 | version = "0.4.0" 2187 | source = "registry+https://github.com/rust-lang/crates.io-index" 2188 | checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" 2189 | 2190 | [[package]] 2191 | name = "winreg" 2192 | version = "0.6.2" 2193 | source = "registry+https://github.com/rust-lang/crates.io-index" 2194 | checksum = "b2986deb581c4fe11b621998a5e53361efe6b48a151178d0cd9eeffa4dc6acc9" 2195 | dependencies = [ 2196 | "winapi 0.3.9", 2197 | ] 2198 | 2199 | [[package]] 2200 | name = "ws2_32-sys" 2201 | version = "0.2.1" 2202 | source = "registry+https://github.com/rust-lang/crates.io-index" 2203 | checksum = "d59cefebd0c892fa2dd6de581e937301d8552cb44489cdff035c6187cb63fa5e" 2204 | dependencies = [ 2205 | "winapi 0.2.8", 2206 | "winapi-build", 2207 | ] 2208 | --------------------------------------------------------------------------------