mirror of
https://github.com/tokio-rs/axum.git
synced 2026-08-29 00:00:18 +02:00
Add async-graphql example (#93)
Fixes https://github.com/tokio-rs/axum/issues/68
This commit is contained in:
@@ -0,0 +1,139 @@
|
||||
mod model;
|
||||
|
||||
use async_graphql::{EmptyMutation, EmptySubscription, Schema};
|
||||
use model::Episode;
|
||||
use slab::Slab;
|
||||
use std::collections::HashMap;
|
||||
|
||||
pub use model::QueryRoot;
|
||||
pub type StarWarsSchema = Schema<QueryRoot, EmptyMutation, EmptySubscription>;
|
||||
|
||||
pub struct StarWarsChar {
|
||||
id: &'static str,
|
||||
name: &'static str,
|
||||
friends: Vec<usize>,
|
||||
appears_in: Vec<Episode>,
|
||||
home_planet: Option<&'static str>,
|
||||
primary_function: Option<&'static str>,
|
||||
}
|
||||
|
||||
pub struct StarWars {
|
||||
luke: usize,
|
||||
artoo: usize,
|
||||
chars: Slab<StarWarsChar>,
|
||||
human_data: HashMap<&'static str, usize>,
|
||||
droid_data: HashMap<&'static str, usize>,
|
||||
}
|
||||
|
||||
impl StarWars {
|
||||
#[allow(clippy::new_without_default)]
|
||||
pub fn new() -> Self {
|
||||
let mut chars = Slab::new();
|
||||
|
||||
let luke = chars.insert(StarWarsChar {
|
||||
id: "1000",
|
||||
name: "Luke Skywalker",
|
||||
friends: vec![],
|
||||
appears_in: vec![],
|
||||
home_planet: Some("Tatooine"),
|
||||
primary_function: None,
|
||||
});
|
||||
|
||||
let vader = chars.insert(StarWarsChar {
|
||||
id: "1001",
|
||||
name: "Luke Skywalker",
|
||||
friends: vec![],
|
||||
appears_in: vec![],
|
||||
home_planet: Some("Tatooine"),
|
||||
primary_function: None,
|
||||
});
|
||||
|
||||
let han = chars.insert(StarWarsChar {
|
||||
id: "1002",
|
||||
name: "Han Solo",
|
||||
friends: vec![],
|
||||
appears_in: vec![Episode::Empire, Episode::NewHope, Episode::Jedi],
|
||||
home_planet: None,
|
||||
primary_function: None,
|
||||
});
|
||||
|
||||
let leia = chars.insert(StarWarsChar {
|
||||
id: "1003",
|
||||
name: "Leia Organa",
|
||||
friends: vec![],
|
||||
appears_in: vec![Episode::Empire, Episode::NewHope, Episode::Jedi],
|
||||
home_planet: Some("Alderaa"),
|
||||
primary_function: None,
|
||||
});
|
||||
|
||||
let tarkin = chars.insert(StarWarsChar {
|
||||
id: "1004",
|
||||
name: "Wilhuff Tarkin",
|
||||
friends: vec![],
|
||||
appears_in: vec![Episode::Empire, Episode::NewHope, Episode::Jedi],
|
||||
home_planet: None,
|
||||
primary_function: None,
|
||||
});
|
||||
|
||||
let threepio = chars.insert(StarWarsChar {
|
||||
id: "2000",
|
||||
name: "C-3PO",
|
||||
friends: vec![],
|
||||
appears_in: vec![Episode::Empire, Episode::NewHope, Episode::Jedi],
|
||||
home_planet: None,
|
||||
primary_function: Some("Protocol"),
|
||||
});
|
||||
|
||||
let artoo = chars.insert(StarWarsChar {
|
||||
id: "2001",
|
||||
name: "R2-D2",
|
||||
friends: vec![],
|
||||
appears_in: vec![Episode::Empire, Episode::NewHope, Episode::Jedi],
|
||||
home_planet: None,
|
||||
primary_function: Some("Astromech"),
|
||||
});
|
||||
|
||||
chars[luke].friends = vec![han, leia, threepio, artoo];
|
||||
chars[vader].friends = vec![tarkin];
|
||||
chars[han].friends = vec![luke, leia, artoo];
|
||||
chars[leia].friends = vec![luke, han, threepio, artoo];
|
||||
chars[tarkin].friends = vec![vader];
|
||||
chars[threepio].friends = vec![luke, han, leia, artoo];
|
||||
chars[artoo].friends = vec![luke, han, leia];
|
||||
|
||||
let mut human_data = HashMap::new();
|
||||
human_data.insert("1000", luke);
|
||||
human_data.insert("1001", vader);
|
||||
human_data.insert("1002", han);
|
||||
human_data.insert("1003", leia);
|
||||
human_data.insert("1004", tarkin);
|
||||
|
||||
let mut droid_data = HashMap::new();
|
||||
droid_data.insert("2000", threepio);
|
||||
droid_data.insert("2001", artoo);
|
||||
|
||||
Self {
|
||||
luke,
|
||||
artoo,
|
||||
chars,
|
||||
human_data,
|
||||
droid_data,
|
||||
}
|
||||
}
|
||||
|
||||
pub fn human(&self, id: &str) -> Option<usize> {
|
||||
self.human_data.get(id).cloned()
|
||||
}
|
||||
|
||||
pub fn droid(&self, id: &str) -> Option<usize> {
|
||||
self.droid_data.get(id).cloned()
|
||||
}
|
||||
|
||||
pub fn humans(&self) -> Vec<usize> {
|
||||
self.human_data.values().cloned().collect()
|
||||
}
|
||||
|
||||
pub fn droids(&self) -> Vec<usize> {
|
||||
self.droid_data.values().cloned().collect()
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user