├── .gitignore ├── client ├── ios │ ├── Flutter │ │ ├── Debug.xcconfig │ │ ├── Release.xcconfig │ │ └── AppFrameworkInfo.plist │ ├── Runner │ │ ├── Runner-Bridging-Header.h │ │ ├── Assets.xcassets │ │ │ ├── LaunchImage.imageset │ │ │ │ ├── LaunchImage.png │ │ │ │ ├── LaunchImage@2x.png │ │ │ │ ├── LaunchImage@3x.png │ │ │ │ ├── README.md │ │ │ │ └── Contents.json │ │ │ └── AppIcon.appiconset │ │ │ │ ├── Icon-App-20x20@1x.png │ │ │ │ ├── Icon-App-20x20@2x.png │ │ │ │ ├── Icon-App-20x20@3x.png │ │ │ │ ├── Icon-App-29x29@1x.png │ │ │ │ ├── Icon-App-29x29@2x.png │ │ │ │ ├── Icon-App-29x29@3x.png │ │ │ │ ├── Icon-App-40x40@1x.png │ │ │ │ ├── Icon-App-40x40@2x.png │ │ │ │ ├── Icon-App-40x40@3x.png │ │ │ │ ├── Icon-App-60x60@2x.png │ │ │ │ ├── Icon-App-60x60@3x.png │ │ │ │ ├── Icon-App-76x76@1x.png │ │ │ │ ├── Icon-App-76x76@2x.png │ │ │ │ ├── Icon-App-1024x1024@1x.png │ │ │ │ ├── Icon-App-83.5x83.5@2x.png │ │ │ │ └── Contents.json │ │ ├── AppDelegate.swift │ │ ├── Base.lproj │ │ │ ├── Main.storyboard │ │ │ └── LaunchScreen.storyboard │ │ └── Info.plist │ ├── Runner.xcodeproj │ │ ├── project.xcworkspace │ │ │ ├── contents.xcworkspacedata │ │ │ └── xcshareddata │ │ │ │ ├── WorkspaceSettings.xcsettings │ │ │ │ └── IDEWorkspaceChecks.plist │ │ ├── xcshareddata │ │ │ └── xcschemes │ │ │ │ └── Runner.xcscheme │ │ └── project.pbxproj │ ├── Runner.xcworkspace │ │ ├── contents.xcworkspacedata │ │ └── xcshareddata │ │ │ ├── WorkspaceSettings.xcsettings │ │ │ └── IDEWorkspaceChecks.plist │ └── .gitignore ├── android │ ├── gradle.properties │ ├── app │ │ ├── src │ │ │ ├── main │ │ │ │ ├── res │ │ │ │ │ ├── mipmap-hdpi │ │ │ │ │ │ └── ic_launcher.png │ │ │ │ │ ├── mipmap-mdpi │ │ │ │ │ │ └── ic_launcher.png │ │ │ │ │ ├── mipmap-xhdpi │ │ │ │ │ │ └── ic_launcher.png │ │ │ │ │ ├── mipmap-xxhdpi │ │ │ │ │ │ └── ic_launcher.png │ │ │ │ │ ├── mipmap-xxxhdpi │ │ │ │ │ │ └── ic_launcher.png │ │ │ │ │ ├── drawable │ │ │ │ │ │ └── launch_background.xml │ │ │ │ │ ├── drawable-v21 │ │ │ │ │ │ └── launch_background.xml │ │ │ │ │ ├── values │ │ │ │ │ │ └── styles.xml │ │ │ │ │ └── values-night │ │ │ │ │ │ └── styles.xml │ │ │ │ ├── kotlin │ │ │ │ │ └── com │ │ │ │ │ │ └── example │ │ │ │ │ │ └── server_driven_ui_demo │ │ │ │ │ │ └── MainActivity.kt │ │ │ │ └── AndroidManifest.xml │ │ │ ├── debug │ │ │ │ └── AndroidManifest.xml │ │ │ └── profile │ │ │ │ └── AndroidManifest.xml │ │ └── build.gradle │ ├── gradle │ │ └── wrapper │ │ │ └── gradle-wrapper.properties │ ├── .gitignore │ ├── settings.gradle │ └── build.gradle ├── lib │ ├── components │ │ ├── component.dart │ │ ├── app_bar_component.dart │ │ ├── column_component.dart │ │ ├── text_field_component.dart │ │ ├── text_button_component.dart │ │ ├── container_component.dart │ │ ├── grid_view_component.dart │ │ └── registry.dart │ ├── main.dart │ ├── api │ │ ├── graphql.dart │ │ └── screen_query.dart │ └── screens │ │ ├── sign_in.dart │ │ └── home.dart ├── .metadata ├── .gitignore ├── pubspec.yaml └── pubspec.lock ├── server ├── src │ ├── resolvers │ │ ├── mod.rs │ │ └── screen │ │ │ ├── query.rs │ │ │ ├── sign_in.rs │ │ │ └── home.rs │ ├── main.rs │ └── schema.rs ├── Cargo.toml └── Cargo.lock ├── LICENSE └── README.md /.gitignore: -------------------------------------------------------------------------------- 1 | target 2 | .DS_Store 3 | .idea 4 | .vscode 5 | -------------------------------------------------------------------------------- /client/ios/Flutter/Debug.xcconfig: -------------------------------------------------------------------------------- 1 | #include "Generated.xcconfig" 2 | -------------------------------------------------------------------------------- /client/ios/Flutter/Release.xcconfig: -------------------------------------------------------------------------------- 1 | #include "Generated.xcconfig" 2 | -------------------------------------------------------------------------------- /client/ios/Runner/Runner-Bridging-Header.h: -------------------------------------------------------------------------------- 1 | #import "GeneratedPluginRegistrant.h" 2 | -------------------------------------------------------------------------------- /server/src/resolvers/mod.rs: -------------------------------------------------------------------------------- 1 | pub mod screen { 2 | mod home; 3 | pub mod query; 4 | mod sign_in; 5 | } 6 | -------------------------------------------------------------------------------- /client/android/gradle.properties: -------------------------------------------------------------------------------- 1 | org.gradle.jvmargs=-Xmx1536M 2 | android.useAndroidX=true 3 | android.enableJetifier=true 4 | -------------------------------------------------------------------------------- /client/android/app/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/parksb/server-driven-ui/HEAD/client/android/app/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /client/android/app/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/parksb/server-driven-ui/HEAD/client/android/app/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /client/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/parksb/server-driven-ui/HEAD/client/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /client/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/parksb/server-driven-ui/HEAD/client/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /client/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/parksb/server-driven-ui/HEAD/client/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /client/lib/components/component.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | abstract class Component { 4 | Widget compose(Map args, BuildContext context); 5 | } 6 | -------------------------------------------------------------------------------- /client/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/parksb/server-driven-ui/HEAD/client/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png -------------------------------------------------------------------------------- /client/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/parksb/server-driven-ui/HEAD/client/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png -------------------------------------------------------------------------------- /client/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/parksb/server-driven-ui/HEAD/client/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png -------------------------------------------------------------------------------- /client/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/parksb/server-driven-ui/HEAD/client/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png -------------------------------------------------------------------------------- /client/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/parksb/server-driven-ui/HEAD/client/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png -------------------------------------------------------------------------------- /client/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/parksb/server-driven-ui/HEAD/client/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png -------------------------------------------------------------------------------- /client/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/parksb/server-driven-ui/HEAD/client/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png -------------------------------------------------------------------------------- /client/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/parksb/server-driven-ui/HEAD/client/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png -------------------------------------------------------------------------------- /client/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/parksb/server-driven-ui/HEAD/client/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png -------------------------------------------------------------------------------- /client/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/parksb/server-driven-ui/HEAD/client/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png -------------------------------------------------------------------------------- /client/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/parksb/server-driven-ui/HEAD/client/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png -------------------------------------------------------------------------------- /client/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/parksb/server-driven-ui/HEAD/client/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png -------------------------------------------------------------------------------- /client/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/parksb/server-driven-ui/HEAD/client/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png -------------------------------------------------------------------------------- /client/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/parksb/server-driven-ui/HEAD/client/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png -------------------------------------------------------------------------------- /client/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/parksb/server-driven-ui/HEAD/client/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png -------------------------------------------------------------------------------- /client/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/parksb/server-driven-ui/HEAD/client/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png -------------------------------------------------------------------------------- /client/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/parksb/server-driven-ui/HEAD/client/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png -------------------------------------------------------------------------------- /client/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/parksb/server-driven-ui/HEAD/client/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png -------------------------------------------------------------------------------- /client/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /client/ios/Runner.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /client/android/app/src/main/kotlin/com/example/server_driven_ui_demo/MainActivity.kt: -------------------------------------------------------------------------------- 1 | package com.example.server_driven_ui_demo 2 | 3 | import io.flutter.embedding.android.FlutterActivity 4 | 5 | class MainActivity: FlutterActivity() { 6 | } 7 | -------------------------------------------------------------------------------- /client/android/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Fri Jun 23 08:50:38 CEST 2017 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | distributionUrl=https\://services.gradle.org/distributions/gradle-6.7-all.zip 7 | -------------------------------------------------------------------------------- /client/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PreviewsEnabled 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /client/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /client/android/.gitignore: -------------------------------------------------------------------------------- 1 | gradle-wrapper.jar 2 | /.gradle 3 | /captures/ 4 | /gradlew 5 | /gradlew.bat 6 | /local.properties 7 | GeneratedPluginRegistrant.java 8 | 9 | # Remember to never publicly share your keystore. 10 | # See https://flutter.dev/docs/deployment/android#reference-the-keystore-from-the-app 11 | key.properties 12 | -------------------------------------------------------------------------------- /client/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PreviewsEnabled 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /client/lib/components/app_bar_component.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | import 'component.dart'; 4 | 5 | class AppBarComponent implements Component { 6 | Widget compose(Map args, BuildContext context) { 7 | return AppBar( 8 | title: Text(args['title']), 9 | ); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /client/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /client/.metadata: -------------------------------------------------------------------------------- 1 | # This file tracks properties of this Flutter project. 2 | # Used by Flutter tool to assess capabilities and perform upgrades etc. 3 | # 4 | # This file should be version controlled and should not be manually edited. 5 | 6 | version: 7 | revision: adc687823a831bbebe28bdccfac1a628ca621513 8 | channel: stable 9 | 10 | project_type: app 11 | -------------------------------------------------------------------------------- /client/lib/components/column_component.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | import 'registry.dart'; 4 | import 'component.dart'; 5 | 6 | class ColumnComponent implements Component { 7 | Widget compose(Map args, BuildContext context) { 8 | return Column( 9 | children: Registry.getComponents(args["children"], context), 10 | ); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /client/android/app/src/debug/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /client/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md: -------------------------------------------------------------------------------- 1 | # Launch Screen Assets 2 | 3 | You can customize the launch screen with your own desired assets by replacing the image files in this directory. 4 | 5 | You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images. -------------------------------------------------------------------------------- /client/android/app/src/profile/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /client/lib/components/text_field_component.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | import 'component.dart'; 4 | 5 | class TextFieldComponent implements Component { 6 | Widget compose(Map args, BuildContext context) { 7 | return TextField( 8 | decoration: InputDecoration( 9 | labelText: args['labelText'], 10 | ), 11 | enabled: args['enabled'], 12 | ); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /client/lib/components/text_button_component.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | import 'component.dart'; 4 | 5 | class TextButtonComponent implements Component { 6 | Widget compose(Map args, BuildContext context) { 7 | return TextButton( 8 | onPressed: args['route'] == null ? null : () => Navigator.pushNamed(context, args['route']), 9 | child: Text(args['text']), 10 | ); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /server/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "server-driven-ui-demo" 3 | version = "0.1.0" 4 | authors = ["parksb "] 5 | edition = "2018" 6 | 7 | # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html 8 | 9 | [dependencies] 10 | actix-web = "3.3" 11 | actix-cors = "0.5" 12 | env_logger = "0.8" 13 | serde = "1.0" 14 | serde_json = "1.0" 15 | serde_derive = "1.0" 16 | juniper = "0.15" 17 | derive_more = "0.99" 18 | -------------------------------------------------------------------------------- /client/ios/Runner/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | import UIKit 2 | import Flutter 3 | 4 | @UIApplicationMain 5 | @objc class AppDelegate: FlutterAppDelegate { 6 | override func application( 7 | _ application: UIApplication, 8 | didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? 9 | ) -> Bool { 10 | GeneratedPluginRegistrant.register(with: self) 11 | return super.application(application, didFinishLaunchingWithOptions: launchOptions) 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /server/src/resolvers/screen/query.rs: -------------------------------------------------------------------------------- 1 | use crate::resolvers::screen; 2 | use crate::schema::*; 3 | 4 | pub fn screen(screen_type: ScreenType) -> Screen { 5 | Screen { 6 | components: get_screen_components(screen_type), 7 | } 8 | } 9 | 10 | fn get_screen_components(screen_type: ScreenType) -> Vec { 11 | match screen_type { 12 | ScreenType::Home => screen::home::components(), 13 | ScreenType::SignIn => screen::sign_in::components(), 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /client/lib/main.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | import 'screens/home.dart'; 4 | import 'screens/sign_in.dart'; 5 | 6 | void main() => runApp(App()); 7 | 8 | class App extends StatelessWidget { 9 | Widget build(BuildContext context) { 10 | return MaterialApp( 11 | title: 'Server Driven UI Demo', 12 | initialRoute: '/home', 13 | routes: { 14 | '/home': (_) => HomeScreen(), 15 | '/sign_in': (_) => SignInScreen(), 16 | }, 17 | ); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /client/android/settings.gradle: -------------------------------------------------------------------------------- 1 | include ':app' 2 | 3 | def localPropertiesFile = new File(rootProject.projectDir, "local.properties") 4 | def properties = new Properties() 5 | 6 | assert localPropertiesFile.exists() 7 | localPropertiesFile.withReader("UTF-8") { reader -> properties.load(reader) } 8 | 9 | def flutterSdkPath = properties.getProperty("flutter.sdk") 10 | assert flutterSdkPath != null, "flutter.sdk not set in local.properties" 11 | apply from: "$flutterSdkPath/packages/flutter_tools/gradle/app_plugin_loader.gradle" 12 | -------------------------------------------------------------------------------- /client/android/app/src/main/res/drawable/launch_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 12 | 13 | -------------------------------------------------------------------------------- /client/android/app/src/main/res/drawable-v21/launch_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 12 | 13 | -------------------------------------------------------------------------------- /client/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "LaunchImage.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "LaunchImage@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "LaunchImage@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /client/lib/components/container_component.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | import 'registry.dart'; 4 | import 'component.dart'; 5 | 6 | class ContainerComponent implements Component { 7 | Widget compose(Map args, BuildContext context) { 8 | return Container( 9 | padding: EdgeInsets.all(args["padding"]), 10 | color: args["color"] == null ? null : Color(args["color"]["value"]).withAlpha(args["color"]["alpha"]), 11 | child: Registry.getComponent(args["child"], context), 12 | ); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /client/lib/components/grid_view_component.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | import 'registry.dart'; 4 | import 'component.dart'; 5 | 6 | class GridViewComponent implements Component { 7 | Widget compose(Map args, BuildContext context) { 8 | return Expanded( 9 | child: GridView.count( 10 | padding: const EdgeInsets.all(20), 11 | crossAxisSpacing: 20, 12 | mainAxisSpacing: 20, 13 | crossAxisCount: args["columnCount"], 14 | children: Registry.getComponents(args["children"], context), 15 | ), 16 | ); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /client/ios/.gitignore: -------------------------------------------------------------------------------- 1 | *.mode1v3 2 | *.mode2v3 3 | *.moved-aside 4 | *.pbxuser 5 | *.perspectivev3 6 | **/*sync/ 7 | .sconsign.dblite 8 | .tags* 9 | **/.vagrant/ 10 | **/DerivedData/ 11 | Icon? 12 | **/Pods/ 13 | **/.symlinks/ 14 | profile 15 | xcuserdata 16 | **/.generated/ 17 | Flutter/App.framework 18 | Flutter/Flutter.framework 19 | Flutter/Flutter.podspec 20 | Flutter/Generated.xcconfig 21 | Flutter/app.flx 22 | Flutter/app.zip 23 | Flutter/flutter_assets/ 24 | Flutter/flutter_export_environment.sh 25 | ServiceDefinitions.json 26 | Runner/GeneratedPluginRegistrant.* 27 | 28 | # Exceptions to above rules. 29 | !default.mode1v3 30 | !default.mode2v3 31 | !default.pbxuser 32 | !default.perspectivev3 33 | -------------------------------------------------------------------------------- /client/lib/api/graphql.dart: -------------------------------------------------------------------------------- 1 | import 'package:graphql/client.dart'; 2 | 3 | class GraphQL { 4 | static final _httpLink = HttpLink( 5 | 'http://127.0.0.1:8080/graphql' 6 | ); 7 | 8 | static final GraphQLClient client = GraphQLClient( 9 | cache: GraphQLCache(), 10 | link: _httpLink, 11 | ); 12 | 13 | static fetch(String query, Map variables) async { 14 | final QueryOptions options = QueryOptions( 15 | document: gql(query), 16 | variables: variables, 17 | ); 18 | 19 | final QueryResult result = await GraphQL.client.query(options); 20 | if (result.hasException) print(result.exception.toString()); 21 | return result.data; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /client/android/build.gradle: -------------------------------------------------------------------------------- 1 | buildscript { 2 | ext.kotlin_version = '1.3.50' 3 | repositories { 4 | google() 5 | jcenter() 6 | } 7 | 8 | dependencies { 9 | classpath 'com.android.tools.build:gradle:4.1.0' 10 | classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" 11 | } 12 | } 13 | 14 | allprojects { 15 | repositories { 16 | google() 17 | jcenter() 18 | } 19 | } 20 | 21 | rootProject.buildDir = '../build' 22 | subprojects { 23 | project.buildDir = "${rootProject.buildDir}/${project.name}" 24 | } 25 | subprojects { 26 | project.evaluationDependsOn(':app') 27 | } 28 | 29 | task clean(type: Delete) { 30 | delete rootProject.buildDir 31 | } 32 | -------------------------------------------------------------------------------- /client/ios/Flutter/AppFrameworkInfo.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | App 9 | CFBundleIdentifier 10 | io.flutter.flutter.app 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | App 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1.0 23 | MinimumOSVersion 24 | 8.0 25 | 26 | 27 | -------------------------------------------------------------------------------- /client/lib/screens/sign_in.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | import '../api/screen_query.dart'; 4 | 5 | class SignInScreen extends StatelessWidget { 6 | Future> _load(BuildContext context) async { 7 | return ScreenQuery.fetchComponents(context, ScreenType.SIGN_IN); 8 | } 9 | 10 | Widget build(BuildContext context) { 11 | return Scaffold( 12 | body: Column( 13 | children: [ 14 | FutureBuilder( 15 | future: _load(context), 16 | builder: (BuildContext context, AsyncSnapshot snapshot) { 17 | if (snapshot.hasData == false) { 18 | return Center(child: CircularProgressIndicator()); 19 | } else { 20 | return Column(children: snapshot.data); 21 | } 22 | }, 23 | ), 24 | ], 25 | ) 26 | ); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /client/.gitignore: -------------------------------------------------------------------------------- 1 | # Miscellaneous 2 | *.class 3 | *.log 4 | *.pyc 5 | *.swp 6 | .DS_Store 7 | .atom/ 8 | .buildlog/ 9 | .history 10 | .svn/ 11 | 12 | # IntelliJ related 13 | *.iml 14 | *.ipr 15 | *.iws 16 | .idea/ 17 | 18 | # The .vscode folder contains launch configuration and tasks you configure in 19 | # VS Code which you may wish to be included in version control, so this line 20 | # is commented out by default. 21 | #.vscode/ 22 | 23 | # Flutter/Dart/Pub related 24 | **/doc/api/ 25 | **/ios/Flutter/.last_build_id 26 | .dart_tool/ 27 | .flutter-plugins 28 | .flutter-plugins-dependencies 29 | .packages 30 | .pub-cache/ 31 | .pub/ 32 | /build/ 33 | 34 | # Web related 35 | lib/generated_plugin_registrant.dart 36 | 37 | # Symbolication related 38 | app.*.symbols 39 | 40 | # Obfuscation related 41 | app.*.map.json 42 | 43 | # Android Studio will place build artifacts here 44 | /android/app/debug 45 | /android/app/profile 46 | /android/app/release 47 | -------------------------------------------------------------------------------- /server/src/resolvers/screen/sign_in.rs: -------------------------------------------------------------------------------- 1 | use crate::schema::*; 2 | 3 | pub fn components() -> Vec { 4 | vec![ 5 | Component::AppBar(AppBar { 6 | title: "Sign in".to_string(), 7 | }), 8 | Component::Container(Container { 9 | padding: 20, 10 | color: None, 11 | child: Box::new(Component::Column(Column { 12 | children: vec![ 13 | Component::TextField(TextField { 14 | label_text: "Email".to_string(), 15 | enabled: true, 16 | placeholder: None, 17 | }), 18 | Component::TextField(TextField { 19 | label_text: "Password".to_string(), 20 | enabled: true, 21 | placeholder: None, 22 | }), 23 | ], 24 | })), 25 | }), 26 | ] 27 | } 28 | -------------------------------------------------------------------------------- /client/lib/screens/home.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | import '../api/screen_query.dart'; 4 | 5 | class HomeScreen extends StatelessWidget { 6 | Future> _load(BuildContext context) async { 7 | return ScreenQuery.fetchComponents(context, ScreenType.HOME); 8 | } 9 | 10 | Widget build(BuildContext context) { 11 | return Scaffold( 12 | body: Column( 13 | children: [ 14 | FutureBuilder( 15 | future: _load(context), 16 | builder: (BuildContext context, AsyncSnapshot snapshot) { 17 | if (snapshot.hasData == false) { 18 | return Center(child: CircularProgressIndicator()); 19 | } else { 20 | return Expanded( 21 | child: Column( 22 | children: snapshot.data, 23 | ), 24 | ); 25 | } 26 | }, 27 | ), 28 | ], 29 | ) 30 | ); 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /client/android/app/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 9 | 15 | 18 | 19 | -------------------------------------------------------------------------------- /client/android/app/src/main/res/values-night/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 9 | 15 | 18 | 19 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 Park Seong-beom 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 | 23 | -------------------------------------------------------------------------------- /client/lib/components/registry.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | import 'component.dart'; 4 | import 'app_bar_component.dart'; 5 | import 'text_field_component.dart'; 6 | import 'text_button_component.dart'; 7 | import 'grid_view_component.dart'; 8 | import 'container_component.dart'; 9 | import 'column_component.dart'; 10 | 11 | class Registry { 12 | static final Map _dictionary = { 13 | 'AppBar': AppBarComponent(), 14 | 'TextField': TextFieldComponent(), 15 | 'TextButton': TextButtonComponent(), 16 | 'GridView': GridViewComponent(), 17 | 'Container': ContainerComponent(), 18 | 'Column': ColumnComponent(), 19 | }; 20 | 21 | static Widget getComponent(dynamic component, BuildContext context) { 22 | var matchedComponent = _dictionary[component['__typename']]; 23 | if (matchedComponent != null) { 24 | return matchedComponent.compose(component, context); 25 | } else { 26 | return null; 27 | } 28 | } 29 | 30 | static List getComponents(dynamic components, BuildContext context) { 31 | var matchedComponent = components as List; 32 | return matchedComponent.map((component) => getComponent(component, context)) 33 | .where((element) => element != null) 34 | .toList(); 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /server/src/resolvers/screen/home.rs: -------------------------------------------------------------------------------- 1 | use crate::schema::*; 2 | 3 | pub fn components() -> Vec { 4 | vec![ 5 | Component::AppBar(AppBar { 6 | title: "Home".to_string(), 7 | }), 8 | Component::GridView(GridView { 9 | column_count: 2, 10 | children: vec![ 11 | Component::Container(Container { 12 | padding: 0, 13 | color: Some(Color { 14 | value: 0x80cbc4, 15 | alpha: 0xff, 16 | }), 17 | child: Box::new(Component::TextButton(TextButton { 18 | text: "Sign in".to_string(), 19 | route: Some("/sign_in".to_string()), 20 | })), 21 | }), 22 | Component::Container(Container { 23 | padding: 0, 24 | color: Some(Color { 25 | value: 0x80cbc4, 26 | alpha: 0xff, 27 | }), 28 | child: Box::new(Component::TextButton(TextButton { 29 | text: "Sign up".to_string(), 30 | route: None, 31 | })), 32 | }), 33 | ], 34 | }), 35 | ] 36 | } 37 | -------------------------------------------------------------------------------- /client/ios/Runner/Base.lproj/Main.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /client/ios/Runner/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | server_driven_ui_demo 15 | CFBundlePackageType 16 | APPL 17 | CFBundleShortVersionString 18 | $(FLUTTER_BUILD_NAME) 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | $(FLUTTER_BUILD_NUMBER) 23 | LSRequiresIPhoneOS 24 | 25 | UILaunchStoryboardName 26 | LaunchScreen 27 | UIMainStoryboardFile 28 | Main 29 | UISupportedInterfaceOrientations 30 | 31 | UIInterfaceOrientationPortrait 32 | UIInterfaceOrientationLandscapeLeft 33 | UIInterfaceOrientationLandscapeRight 34 | 35 | UISupportedInterfaceOrientations~ipad 36 | 37 | UIInterfaceOrientationPortrait 38 | UIInterfaceOrientationPortraitUpsideDown 39 | UIInterfaceOrientationLandscapeLeft 40 | UIInterfaceOrientationLandscapeRight 41 | 42 | UIViewControllerBasedStatusBarAppearance 43 | 44 | 45 | 46 | -------------------------------------------------------------------------------- /client/android/app/build.gradle: -------------------------------------------------------------------------------- 1 | def localProperties = new Properties() 2 | def localPropertiesFile = rootProject.file('local.properties') 3 | if (localPropertiesFile.exists()) { 4 | localPropertiesFile.withReader('UTF-8') { reader -> 5 | localProperties.load(reader) 6 | } 7 | } 8 | 9 | def flutterRoot = localProperties.getProperty('flutter.sdk') 10 | if (flutterRoot == null) { 11 | throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.") 12 | } 13 | 14 | def flutterVersionCode = localProperties.getProperty('flutter.versionCode') 15 | if (flutterVersionCode == null) { 16 | flutterVersionCode = '1' 17 | } 18 | 19 | def flutterVersionName = localProperties.getProperty('flutter.versionName') 20 | if (flutterVersionName == null) { 21 | flutterVersionName = '1.0' 22 | } 23 | 24 | apply plugin: 'com.android.application' 25 | apply plugin: 'kotlin-android' 26 | apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" 27 | 28 | android { 29 | compileSdkVersion 30 30 | 31 | sourceSets { 32 | main.java.srcDirs += 'src/main/kotlin' 33 | } 34 | 35 | defaultConfig { 36 | // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). 37 | applicationId "com.example.server_driven_ui_demo" 38 | minSdkVersion 16 39 | targetSdkVersion 30 40 | versionCode flutterVersionCode.toInteger() 41 | versionName flutterVersionName 42 | } 43 | 44 | buildTypes { 45 | release { 46 | // TODO: Add your own signing config for the release build. 47 | // Signing with the debug keys for now, so `flutter run --release` works. 48 | signingConfig signingConfigs.debug 49 | } 50 | } 51 | } 52 | 53 | flutter { 54 | source '../..' 55 | } 56 | 57 | dependencies { 58 | implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" 59 | } 60 | -------------------------------------------------------------------------------- /server/src/main.rs: -------------------------------------------------------------------------------- 1 | use actix_cors::Cors; 2 | use actix_web::{http, middleware, web, App, Error, HttpResponse, HttpServer}; 3 | use juniper::http::graphiql::graphiql_source; 4 | use juniper::http::GraphQLRequest; 5 | use std::io; 6 | use std::sync::Arc; 7 | 8 | pub mod resolvers; 9 | pub mod schema; 10 | 11 | use crate::schema::{create_schema, Schema}; 12 | 13 | async fn graphiql() -> HttpResponse { 14 | let html = graphiql_source("http://127.0.0.1:8080/graphql", None); 15 | HttpResponse::Ok() 16 | .content_type("text/html; charset=utf-8") 17 | .body(html) 18 | } 19 | 20 | async fn graphql( 21 | st: web::Data>, 22 | data: web::Json, 23 | ) -> Result { 24 | let user = web::block(move || { 25 | let res = data.execute_sync(&st, &()); 26 | Ok::<_, serde_json::error::Error>(serde_json::to_string(&res)?) 27 | }) 28 | .await?; 29 | 30 | Ok(HttpResponse::Ok() 31 | .content_type("application/json") 32 | .body(user)) 33 | } 34 | 35 | #[actix_web::main] 36 | async fn main() -> io::Result<()> { 37 | std::env::set_var("RUST_LOG", "actix_web=info"); 38 | env_logger::init(); 39 | 40 | // Create Juniper schema 41 | let schema = std::sync::Arc::new(create_schema()); 42 | 43 | // Start http server 44 | HttpServer::new(move || { 45 | App::new() 46 | .data(schema.clone()) 47 | .wrap(middleware::Logger::default()) 48 | .wrap( 49 | Cors::default() 50 | .allowed_origin_fn(|origin, _| { 51 | origin.as_bytes().starts_with(b"http://localhost") 52 | }) 53 | .allowed_methods(vec!["POST", "GET"]) 54 | .allowed_headers(vec![ 55 | http::header::AUTHORIZATION, 56 | http::header::ACCEPT, 57 | http::header::CONTENT_TYPE, 58 | ]) 59 | .supports_credentials() 60 | .max_age(3600), 61 | ) 62 | .service(web::resource("/graphql").route(web::post().to(graphql))) 63 | .service(web::resource("/graphiql").route(web::get().to(graphiql))) 64 | }) 65 | .bind("127.0.0.1:8080")? 66 | .run() 67 | .await 68 | } 69 | -------------------------------------------------------------------------------- /client/android/app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 6 | 13 | 17 | 21 | 26 | 30 | 31 | 32 | 33 | 34 | 35 | 37 | 40 | 41 | 42 | -------------------------------------------------------------------------------- /client/lib/api/screen_query.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | import 'graphql.dart'; 4 | import '../components/registry.dart'; 5 | 6 | enum ScreenType { 7 | HOME, 8 | SIGN_IN, 9 | } 10 | 11 | extension ScreenTypeExtension on ScreenType { 12 | String get name { 13 | switch (this) { 14 | case ScreenType.HOME: return 'HOME'; 15 | case ScreenType.SIGN_IN: return 'SIGN_IN'; 16 | default: return ScreenType.HOME.name; 17 | } 18 | } 19 | } 20 | 21 | class ScreenQuery { 22 | static Future> fetchComponents(BuildContext context, ScreenType screenType) async { 23 | var data = await fetch(screenType); 24 | return Registry.getComponents(data['screen']['components'], context); 25 | } 26 | 27 | static fetch(ScreenType screenType) async { 28 | var appBarFragment = r''' 29 | ... on AppBar { 30 | __typename 31 | title 32 | } 33 | '''; 34 | 35 | var textFieldFragment = r''' 36 | ... on TextField { 37 | __typename 38 | labelText 39 | placeholder 40 | enabled 41 | } 42 | '''; 43 | 44 | var textButtonFragment = r''' 45 | ... on TextButton { 46 | __typename 47 | text 48 | route 49 | } 50 | '''; 51 | 52 | var componentFragments = 53 | appBarFragment + textFieldFragment + textButtonFragment; 54 | 55 | var columnFragment = r''' 56 | ... on Column { 57 | children { 58 | ''' + componentFragments + ''' 59 | } 60 | } 61 | '''; 62 | 63 | var containerFragment = r''' 64 | ... on Container { 65 | padding 66 | color { 67 | value 68 | alpha 69 | } 70 | child { 71 | ''' + columnFragment + componentFragments + r''' 72 | } 73 | } 74 | '''; 75 | 76 | var gridViewFragment = r''' 77 | ... on GridView { 78 | columnCount 79 | children { 80 | ''' + containerFragment + r''' 81 | } 82 | } 83 | '''; 84 | 85 | var query = r''' 86 | query getScreen($screenType: ScreenType!) { 87 | screen(screenType: $screenType) { 88 | components { 89 | ''' + componentFragments + gridViewFragment + containerFragment + r''' 90 | } 91 | } 92 | } 93 | '''; 94 | 95 | final variables = { 'screenType': screenType.name }; 96 | return GraphQL.fetch(query, variables); 97 | } 98 | } 99 | -------------------------------------------------------------------------------- /server/src/schema.rs: -------------------------------------------------------------------------------- 1 | use derive_more::From; 2 | use juniper::{EmptySubscription, FieldResult, RootNode}; 3 | use juniper::{GraphQLEnum, GraphQLObject, GraphQLUnion}; 4 | 5 | use crate::resolvers; 6 | 7 | #[derive(GraphQLEnum)] 8 | pub enum ScreenType { 9 | Home, 10 | SignIn, 11 | } 12 | 13 | #[derive(GraphQLObject)] 14 | pub struct Screen { 15 | pub components: Vec, 16 | } 17 | 18 | #[derive(From, GraphQLUnion)] 19 | pub enum Component { 20 | AppBar(AppBar), 21 | TextButton(TextButton), 22 | TextField(TextField), 23 | GridView(GridView), 24 | Container(Container), 25 | Column(Column), 26 | } 27 | 28 | // +------------+ 29 | // | Components | 30 | // +------------+ 31 | 32 | #[derive(GraphQLObject)] 33 | pub struct AppBar { 34 | pub title: String, 35 | } 36 | 37 | #[derive(GraphQLObject)] 38 | pub struct TextButton { 39 | pub text: String, 40 | pub route: Option, 41 | } 42 | 43 | #[derive(GraphQLObject)] 44 | pub struct TextField { 45 | pub label_text: String, 46 | pub placeholder: Option, 47 | pub enabled: bool, 48 | } 49 | 50 | #[derive(GraphQLObject)] 51 | pub struct GridView { 52 | pub column_count: i32, 53 | pub children: Vec, 54 | } 55 | 56 | #[derive(GraphQLObject)] 57 | pub struct Container { 58 | pub padding: i32, 59 | pub color: Option, 60 | pub child: Box, 61 | } 62 | 63 | #[derive(GraphQLObject)] 64 | pub struct Column { 65 | pub children: Vec, 66 | } 67 | 68 | #[derive(GraphQLObject)] 69 | pub struct Color { 70 | pub value: i32, 71 | pub alpha: i32, 72 | } 73 | 74 | // +---------+ 75 | // | Queries | 76 | // +---------+ 77 | 78 | pub struct QueryRoot; 79 | 80 | #[juniper::graphql_object] 81 | impl QueryRoot { 82 | fn screen(screen_type: ScreenType) -> FieldResult { 83 | Ok(resolvers::screen::query::screen(screen_type)) 84 | } 85 | } 86 | 87 | // +-----------+ 88 | // | Mutations | 89 | // +-----------+ 90 | 91 | pub struct MutationRoot; 92 | 93 | #[juniper::graphql_object] 94 | impl MutationRoot { 95 | fn placeholder() -> FieldResult { 96 | Ok(true) 97 | } 98 | } 99 | 100 | pub type Schema = RootNode<'static, QueryRoot, MutationRoot, EmptySubscription>; 101 | 102 | pub fn create_schema() -> Schema { 103 | Schema::new(QueryRoot {}, MutationRoot {}, EmptySubscription::new()) 104 | } 105 | -------------------------------------------------------------------------------- /client/ios/Runner/Base.lproj/LaunchScreen.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /client/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "size" : "20x20", 5 | "idiom" : "iphone", 6 | "filename" : "Icon-App-20x20@2x.png", 7 | "scale" : "2x" 8 | }, 9 | { 10 | "size" : "20x20", 11 | "idiom" : "iphone", 12 | "filename" : "Icon-App-20x20@3x.png", 13 | "scale" : "3x" 14 | }, 15 | { 16 | "size" : "29x29", 17 | "idiom" : "iphone", 18 | "filename" : "Icon-App-29x29@1x.png", 19 | "scale" : "1x" 20 | }, 21 | { 22 | "size" : "29x29", 23 | "idiom" : "iphone", 24 | "filename" : "Icon-App-29x29@2x.png", 25 | "scale" : "2x" 26 | }, 27 | { 28 | "size" : "29x29", 29 | "idiom" : "iphone", 30 | "filename" : "Icon-App-29x29@3x.png", 31 | "scale" : "3x" 32 | }, 33 | { 34 | "size" : "40x40", 35 | "idiom" : "iphone", 36 | "filename" : "Icon-App-40x40@2x.png", 37 | "scale" : "2x" 38 | }, 39 | { 40 | "size" : "40x40", 41 | "idiom" : "iphone", 42 | "filename" : "Icon-App-40x40@3x.png", 43 | "scale" : "3x" 44 | }, 45 | { 46 | "size" : "60x60", 47 | "idiom" : "iphone", 48 | "filename" : "Icon-App-60x60@2x.png", 49 | "scale" : "2x" 50 | }, 51 | { 52 | "size" : "60x60", 53 | "idiom" : "iphone", 54 | "filename" : "Icon-App-60x60@3x.png", 55 | "scale" : "3x" 56 | }, 57 | { 58 | "size" : "20x20", 59 | "idiom" : "ipad", 60 | "filename" : "Icon-App-20x20@1x.png", 61 | "scale" : "1x" 62 | }, 63 | { 64 | "size" : "20x20", 65 | "idiom" : "ipad", 66 | "filename" : "Icon-App-20x20@2x.png", 67 | "scale" : "2x" 68 | }, 69 | { 70 | "size" : "29x29", 71 | "idiom" : "ipad", 72 | "filename" : "Icon-App-29x29@1x.png", 73 | "scale" : "1x" 74 | }, 75 | { 76 | "size" : "29x29", 77 | "idiom" : "ipad", 78 | "filename" : "Icon-App-29x29@2x.png", 79 | "scale" : "2x" 80 | }, 81 | { 82 | "size" : "40x40", 83 | "idiom" : "ipad", 84 | "filename" : "Icon-App-40x40@1x.png", 85 | "scale" : "1x" 86 | }, 87 | { 88 | "size" : "40x40", 89 | "idiom" : "ipad", 90 | "filename" : "Icon-App-40x40@2x.png", 91 | "scale" : "2x" 92 | }, 93 | { 94 | "size" : "76x76", 95 | "idiom" : "ipad", 96 | "filename" : "Icon-App-76x76@1x.png", 97 | "scale" : "1x" 98 | }, 99 | { 100 | "size" : "76x76", 101 | "idiom" : "ipad", 102 | "filename" : "Icon-App-76x76@2x.png", 103 | "scale" : "2x" 104 | }, 105 | { 106 | "size" : "83.5x83.5", 107 | "idiom" : "ipad", 108 | "filename" : "Icon-App-83.5x83.5@2x.png", 109 | "scale" : "2x" 110 | }, 111 | { 112 | "size" : "1024x1024", 113 | "idiom" : "ios-marketing", 114 | "filename" : "Icon-App-1024x1024@1x.png", 115 | "scale" : "1x" 116 | } 117 | ], 118 | "info" : { 119 | "version" : 1, 120 | "author" : "xcode" 121 | } 122 | } 123 | -------------------------------------------------------------------------------- /client/pubspec.yaml: -------------------------------------------------------------------------------- 1 | name: server_driven_ui_demo 2 | description: A new Flutter project. 3 | 4 | # The following line prevents the package from being accidentally published to 5 | # pub.dev using `pub publish`. This is preferred for private packages. 6 | publish_to: 'none' # Remove this line if you wish to publish to pub.dev 7 | 8 | # The following defines the version and build number for your application. 9 | # A version number is three numbers separated by dots, like 1.2.43 10 | # followed by an optional build number separated by a +. 11 | # Both the version and the builder number may be overridden in flutter 12 | # build by specifying --build-name and --build-number, respectively. 13 | # In Android, build-name is used as versionName while build-number used as versionCode. 14 | # Read more about Android versioning at https://developer.android.com/studio/publish/versioning 15 | # In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion. 16 | # Read more about iOS versioning at 17 | # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html 18 | version: 1.0.0+1 19 | 20 | environment: 21 | sdk: ">=2.7.0 <3.0.0" 22 | 23 | dependencies: 24 | flutter: 25 | sdk: flutter 26 | graphql: ^4.0.0-beta 27 | 28 | 29 | # The following adds the Cupertino Icons font to your application. 30 | # Use with the CupertinoIcons class for iOS style icons. 31 | cupertino_icons: ^1.0.2 32 | 33 | dev_dependencies: 34 | flutter_test: 35 | sdk: flutter 36 | 37 | # For information on the generic Dart part of this file, see the 38 | # following page: https://dart.dev/tools/pub/pubspec 39 | 40 | # The following section is specific to Flutter. 41 | flutter: 42 | 43 | # The following line ensures that the Material Icons font is 44 | # included with your application, so that you can use the icons in 45 | # the material Icons class. 46 | uses-material-design: true 47 | 48 | # To add assets to your application, add an assets section, like this: 49 | # assets: 50 | # - images/a_dot_burr.jpeg 51 | # - images/a_dot_ham.jpeg 52 | 53 | # An image asset can refer to one or more resolution-specific "variants", see 54 | # https://flutter.dev/assets-and-images/#resolution-aware. 55 | 56 | # For details regarding adding assets from package dependencies, see 57 | # https://flutter.dev/assets-and-images/#from-packages 58 | 59 | # To add custom fonts to your application, add a fonts section here, 60 | # in this "flutter" section. Each entry in this list should have a 61 | # "family" key with the font family name, and a "fonts" key with a 62 | # list giving the asset and other descriptors for the font. For 63 | # example: 64 | # fonts: 65 | # - family: Schyler 66 | # fonts: 67 | # - asset: fonts/Schyler-Regular.ttf 68 | # - asset: fonts/Schyler-Italic.ttf 69 | # style: italic 70 | # - family: Trajan Pro 71 | # fonts: 72 | # - asset: fonts/TrajanPro.ttf 73 | # - asset: fonts/TrajanPro_Bold.ttf 74 | # weight: 700 75 | # 76 | # For details regarding fonts from package dependencies, 77 | # see https://flutter.dev/custom-fonts/#from-packages 78 | -------------------------------------------------------------------------------- /client/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 39 | 40 | 41 | 42 | 43 | 44 | 54 | 56 | 62 | 63 | 64 | 65 | 66 | 67 | 73 | 75 | 81 | 82 | 83 | 84 | 86 | 87 | 90 | 91 | 92 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Server Driven UI Demo 2 | 3 | * Server Driven UI(SDUI)는 서버에서 클라이언트의 UI 컴포넌트를 관리하는 방식. 4 | * 클라이언트 배포없이 API 응답을 변경하는 것만으로 UI 변경이 가능한 동시에 하위 호환성을 확보할 수 있다. 5 | * Rust, GraphQL, Flutter로 간단히 동작하는 SDUI 데모를 구현한다: 6 | * Flutter의 체계적인 위젯 시스템이 UI 컴포넌트 개념에 부합한다. 7 | * flutter/material 라이브러리가 material design system을 높은 수준으로 구현하고 있어 스키마 디자인이 수월하다. 8 | * GraphQL은 재사용 가능한 fragment를 지원하기 때문에 컴포넌트 인터페이스를 주고받기 적합하다. 9 | 10 | ## Description 11 | 12 | * 스크린(화면을 구성하는 가장 큰 단위) 안에 다양한 컴포넌트가 배치된다. 13 | * `screenType` 인자로 화면 유형을 선택하면 서버가 해당 화면에 맞는 컴포넌트를 응답한다. 14 | * 각 컴포넌트는 `Component` 인터페이스를 구현하며, `screen.components` 필드는 `[Component!]!`를 반환한다. 15 | * 클라이언트는 사용 가능한 모든 컴포넌트를 요청하며, 응답받은 컴포넌트의 `__typename`과 위젯을 매핑한다. 16 | 17 | ### Component fragments 18 | 19 | ```graphql 20 | fragment AppBar on AppBar { 21 | __typename 22 | title 23 | } 24 | 25 | fragment TextField on TextField { 26 | __typename 27 | labelText 28 | placeholder 29 | enabled 30 | } 31 | 32 | fragment TextButton on TextButton { 33 | __typename 34 | text 35 | route 36 | } 37 | 38 | fragment Container on Container { 39 | __typename 40 | padding 41 | color { 42 | value 43 | alpha 44 | } 45 | child { 46 | ... AppBar 47 | ... TextField 48 | ... TextButton 49 | } 50 | } 51 | 52 | fragment GridView on GridView { 53 | __typename 54 | columnCount 55 | children { 56 | ... AppBar 57 | ... TextField 58 | ... TextButton 59 | ... Container 60 | } 61 | } 62 | ``` 63 | 64 | ### Request 65 | 66 | ```graphql 67 | query getScreen { 68 | screen(screenType: HOME) { 69 | components { 70 | ... AppBar 71 | ... TextField 72 | ... TextButton 73 | ... Container 74 | ... GridView 75 | } 76 | } 77 | } 78 | ``` 79 | 80 | ### Response 81 | 82 | ```json 83 | { 84 | "data": { 85 | "screen": { 86 | "components": [ 87 | { 88 | "__typename": "AppBar", 89 | "title": "Home" 90 | }, 91 | { 92 | "__typename": "GridView", 93 | "columnCount": 2, 94 | "children": [ 95 | { 96 | "__typename": "Container", 97 | "padding": 0, 98 | "color": { 99 | "value": 8440772, 100 | "alpha": 255 101 | }, 102 | "child": { 103 | "__typename": "TextButton", 104 | "text": "Sign in", 105 | "route": "/sign_in" 106 | } 107 | }, 108 | { 109 | "__typename": "Container", 110 | "padding": 0, 111 | "color": { 112 | "value": 8440772, 113 | "alpha": 255 114 | }, 115 | "child": { 116 | "__typename": "TextButton", 117 | "text": "Sign up", 118 | "route": null 119 | } 120 | } 121 | ] 122 | } 123 | ] 124 | } 125 | } 126 | } 127 | ``` 128 | 129 | ## Future work 130 | 131 | * [ ] 클라이언트 타이핑 고도화 132 | * [x] 컴포넌트 스타일 고도화 133 | * [x] 중첩 컴포넌트 134 | * [ ] 컴포넌트 페이지네이션 135 | * [ ] 특정 컴포넌트 리로딩 136 | 137 | ## References 138 | 139 | * [박호준, "GraphQL이 가져온 에어비앤비 프론트앤드 기술의 변천사", DEVIEW 2020, 2020.](https://deview.kr/2020/sessions/337) 140 | * [김도훈, "Server Driven UI (Feat.Flutter)", 2020.](https://medium.com/@kimdohun0104/server-driven-ui-feat-flutter-87fcbb04e610) 141 | * [Tom Lokhorst, "Server Driven UI", Tom Lokhorst's blog, 2020.](http://tom.lokhorst.eu/2020/07/server-driven-ui) 142 | * [Ryan Brroks, "A Deep Dive into Airbnb’s Server-Driven UI System", 2021.](https://medium.com/airbnb-engineering/a-deep-dive-into-airbnbs-server-driven-ui-system-842244c5f5) 143 | 144 | ## License 145 | 146 | This project is distributed under the MIT License - see the [LICENSE](LICENSE) file for details. 147 | -------------------------------------------------------------------------------- /client/pubspec.lock: -------------------------------------------------------------------------------- 1 | # Generated by pub 2 | # See https://dart.dev/tools/pub/glossary#lockfile 3 | packages: 4 | async: 5 | dependency: transitive 6 | description: 7 | name: async 8 | url: "https://pub.dartlang.org" 9 | source: hosted 10 | version: "2.5.0" 11 | boolean_selector: 12 | dependency: transitive 13 | description: 14 | name: boolean_selector 15 | url: "https://pub.dartlang.org" 16 | source: hosted 17 | version: "2.1.0" 18 | characters: 19 | dependency: transitive 20 | description: 21 | name: characters 22 | url: "https://pub.dartlang.org" 23 | source: hosted 24 | version: "1.1.0" 25 | charcode: 26 | dependency: transitive 27 | description: 28 | name: charcode 29 | url: "https://pub.dartlang.org" 30 | source: hosted 31 | version: "1.2.0" 32 | clock: 33 | dependency: transitive 34 | description: 35 | name: clock 36 | url: "https://pub.dartlang.org" 37 | source: hosted 38 | version: "1.1.0" 39 | collection: 40 | dependency: transitive 41 | description: 42 | name: collection 43 | url: "https://pub.dartlang.org" 44 | source: hosted 45 | version: "1.15.0" 46 | convert: 47 | dependency: transitive 48 | description: 49 | name: convert 50 | url: "https://pub.dartlang.org" 51 | source: hosted 52 | version: "2.1.1" 53 | crypto: 54 | dependency: transitive 55 | description: 56 | name: crypto 57 | url: "https://pub.dartlang.org" 58 | source: hosted 59 | version: "2.1.5" 60 | cupertino_icons: 61 | dependency: "direct main" 62 | description: 63 | name: cupertino_icons 64 | url: "https://pub.dartlang.org" 65 | source: hosted 66 | version: "1.0.2" 67 | fake_async: 68 | dependency: transitive 69 | description: 70 | name: fake_async 71 | url: "https://pub.dartlang.org" 72 | source: hosted 73 | version: "1.2.0" 74 | flutter: 75 | dependency: "direct main" 76 | description: flutter 77 | source: sdk 78 | version: "0.0.0" 79 | flutter_test: 80 | dependency: "direct dev" 81 | description: flutter 82 | source: sdk 83 | version: "0.0.0" 84 | gql: 85 | dependency: transitive 86 | description: 87 | name: gql 88 | url: "https://pub.dartlang.org" 89 | source: hosted 90 | version: "0.12.4" 91 | gql_dedupe_link: 92 | dependency: transitive 93 | description: 94 | name: gql_dedupe_link 95 | url: "https://pub.dartlang.org" 96 | source: hosted 97 | version: "1.0.10" 98 | gql_error_link: 99 | dependency: transitive 100 | description: 101 | name: gql_error_link 102 | url: "https://pub.dartlang.org" 103 | source: hosted 104 | version: "0.1.1-alpha+1601131172858" 105 | gql_exec: 106 | dependency: transitive 107 | description: 108 | name: gql_exec 109 | url: "https://pub.dartlang.org" 110 | source: hosted 111 | version: "0.2.5" 112 | gql_http_link: 113 | dependency: transitive 114 | description: 115 | name: gql_http_link 116 | url: "https://pub.dartlang.org" 117 | source: hosted 118 | version: "0.3.2" 119 | gql_link: 120 | dependency: transitive 121 | description: 122 | name: gql_link 123 | url: "https://pub.dartlang.org" 124 | source: hosted 125 | version: "0.3.1" 126 | gql_transform_link: 127 | dependency: transitive 128 | description: 129 | name: gql_transform_link 130 | url: "https://pub.dartlang.org" 131 | source: hosted 132 | version: "0.1.5" 133 | graphql: 134 | dependency: "direct main" 135 | description: 136 | name: graphql 137 | url: "https://pub.dartlang.org" 138 | source: hosted 139 | version: "4.0.1" 140 | hive: 141 | dependency: transitive 142 | description: 143 | name: hive 144 | url: "https://pub.dartlang.org" 145 | source: hosted 146 | version: "1.4.4+1" 147 | http: 148 | dependency: transitive 149 | description: 150 | name: http 151 | url: "https://pub.dartlang.org" 152 | source: hosted 153 | version: "0.12.2" 154 | http_parser: 155 | dependency: transitive 156 | description: 157 | name: http_parser 158 | url: "https://pub.dartlang.org" 159 | source: hosted 160 | version: "3.1.4" 161 | matcher: 162 | dependency: transitive 163 | description: 164 | name: matcher 165 | url: "https://pub.dartlang.org" 166 | source: hosted 167 | version: "0.12.10" 168 | meta: 169 | dependency: transitive 170 | description: 171 | name: meta 172 | url: "https://pub.dartlang.org" 173 | source: hosted 174 | version: "1.3.0" 175 | normalize: 176 | dependency: transitive 177 | description: 178 | name: normalize 179 | url: "https://pub.dartlang.org" 180 | source: hosted 181 | version: "0.4.7" 182 | path: 183 | dependency: transitive 184 | description: 185 | name: path 186 | url: "https://pub.dartlang.org" 187 | source: hosted 188 | version: "1.8.0" 189 | pedantic: 190 | dependency: transitive 191 | description: 192 | name: pedantic 193 | url: "https://pub.dartlang.org" 194 | source: hosted 195 | version: "1.11.0" 196 | rxdart: 197 | dependency: transitive 198 | description: 199 | name: rxdart 200 | url: "https://pub.dartlang.org" 201 | source: hosted 202 | version: "0.24.1" 203 | sky_engine: 204 | dependency: transitive 205 | description: flutter 206 | source: sdk 207 | version: "0.0.99" 208 | source_span: 209 | dependency: transitive 210 | description: 211 | name: source_span 212 | url: "https://pub.dartlang.org" 213 | source: hosted 214 | version: "1.8.0" 215 | stack_trace: 216 | dependency: transitive 217 | description: 218 | name: stack_trace 219 | url: "https://pub.dartlang.org" 220 | source: hosted 221 | version: "1.10.0" 222 | stream_channel: 223 | dependency: transitive 224 | description: 225 | name: stream_channel 226 | url: "https://pub.dartlang.org" 227 | source: hosted 228 | version: "2.1.0" 229 | string_scanner: 230 | dependency: transitive 231 | description: 232 | name: string_scanner 233 | url: "https://pub.dartlang.org" 234 | source: hosted 235 | version: "1.1.0" 236 | term_glyph: 237 | dependency: transitive 238 | description: 239 | name: term_glyph 240 | url: "https://pub.dartlang.org" 241 | source: hosted 242 | version: "1.2.0" 243 | test_api: 244 | dependency: transitive 245 | description: 246 | name: test_api 247 | url: "https://pub.dartlang.org" 248 | source: hosted 249 | version: "0.2.19" 250 | typed_data: 251 | dependency: transitive 252 | description: 253 | name: typed_data 254 | url: "https://pub.dartlang.org" 255 | source: hosted 256 | version: "1.3.0" 257 | uuid_enhanced: 258 | dependency: transitive 259 | description: 260 | name: uuid_enhanced 261 | url: "https://pub.dartlang.org" 262 | source: hosted 263 | version: "3.0.2" 264 | vector_math: 265 | dependency: transitive 266 | description: 267 | name: vector_math 268 | url: "https://pub.dartlang.org" 269 | source: hosted 270 | version: "2.1.0" 271 | websocket: 272 | dependency: transitive 273 | description: 274 | name: websocket 275 | url: "https://pub.dartlang.org" 276 | source: hosted 277 | version: "0.0.5" 278 | sdks: 279 | dart: ">=2.12.0-0.0 <3.0.0" 280 | -------------------------------------------------------------------------------- /client/ios/Runner.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; 11 | 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; 12 | 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; 13 | 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 14 | 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; 15 | 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; 16 | /* End PBXBuildFile section */ 17 | 18 | /* Begin PBXCopyFilesBuildPhase section */ 19 | 9705A1C41CF9048500538489 /* Embed Frameworks */ = { 20 | isa = PBXCopyFilesBuildPhase; 21 | buildActionMask = 2147483647; 22 | dstPath = ""; 23 | dstSubfolderSpec = 10; 24 | files = ( 25 | ); 26 | name = "Embed Frameworks"; 27 | runOnlyForDeploymentPostprocessing = 0; 28 | }; 29 | /* End PBXCopyFilesBuildPhase section */ 30 | 31 | /* Begin PBXFileReference section */ 32 | 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 33 | 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; 34 | 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; 35 | 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 36 | 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 37 | 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; 38 | 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; 39 | 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; 40 | 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; 41 | 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 42 | 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 43 | 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 44 | 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 45 | /* End PBXFileReference section */ 46 | 47 | /* Begin PBXFrameworksBuildPhase section */ 48 | 97C146EB1CF9000F007C117D /* Frameworks */ = { 49 | isa = PBXFrameworksBuildPhase; 50 | buildActionMask = 2147483647; 51 | files = ( 52 | ); 53 | runOnlyForDeploymentPostprocessing = 0; 54 | }; 55 | /* End PBXFrameworksBuildPhase section */ 56 | 57 | /* Begin PBXGroup section */ 58 | 9740EEB11CF90186004384FC /* Flutter */ = { 59 | isa = PBXGroup; 60 | children = ( 61 | 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, 62 | 9740EEB21CF90195004384FC /* Debug.xcconfig */, 63 | 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, 64 | 9740EEB31CF90195004384FC /* Generated.xcconfig */, 65 | ); 66 | name = Flutter; 67 | sourceTree = ""; 68 | }; 69 | 97C146E51CF9000F007C117D = { 70 | isa = PBXGroup; 71 | children = ( 72 | 9740EEB11CF90186004384FC /* Flutter */, 73 | 97C146F01CF9000F007C117D /* Runner */, 74 | 97C146EF1CF9000F007C117D /* Products */, 75 | ); 76 | sourceTree = ""; 77 | }; 78 | 97C146EF1CF9000F007C117D /* Products */ = { 79 | isa = PBXGroup; 80 | children = ( 81 | 97C146EE1CF9000F007C117D /* Runner.app */, 82 | ); 83 | name = Products; 84 | sourceTree = ""; 85 | }; 86 | 97C146F01CF9000F007C117D /* Runner */ = { 87 | isa = PBXGroup; 88 | children = ( 89 | 97C146FA1CF9000F007C117D /* Main.storyboard */, 90 | 97C146FD1CF9000F007C117D /* Assets.xcassets */, 91 | 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, 92 | 97C147021CF9000F007C117D /* Info.plist */, 93 | 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */, 94 | 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */, 95 | 74858FAE1ED2DC5600515810 /* AppDelegate.swift */, 96 | 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */, 97 | ); 98 | path = Runner; 99 | sourceTree = ""; 100 | }; 101 | /* End PBXGroup section */ 102 | 103 | /* Begin PBXNativeTarget section */ 104 | 97C146ED1CF9000F007C117D /* Runner */ = { 105 | isa = PBXNativeTarget; 106 | buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; 107 | buildPhases = ( 108 | 9740EEB61CF901F6004384FC /* Run Script */, 109 | 97C146EA1CF9000F007C117D /* Sources */, 110 | 97C146EB1CF9000F007C117D /* Frameworks */, 111 | 97C146EC1CF9000F007C117D /* Resources */, 112 | 9705A1C41CF9048500538489 /* Embed Frameworks */, 113 | 3B06AD1E1E4923F5004D2608 /* Thin Binary */, 114 | ); 115 | buildRules = ( 116 | ); 117 | dependencies = ( 118 | ); 119 | name = Runner; 120 | productName = Runner; 121 | productReference = 97C146EE1CF9000F007C117D /* Runner.app */; 122 | productType = "com.apple.product-type.application"; 123 | }; 124 | /* End PBXNativeTarget section */ 125 | 126 | /* Begin PBXProject section */ 127 | 97C146E61CF9000F007C117D /* Project object */ = { 128 | isa = PBXProject; 129 | attributes = { 130 | LastUpgradeCheck = 1020; 131 | ORGANIZATIONNAME = ""; 132 | TargetAttributes = { 133 | 97C146ED1CF9000F007C117D = { 134 | CreatedOnToolsVersion = 7.3.1; 135 | LastSwiftMigration = 1100; 136 | }; 137 | }; 138 | }; 139 | buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; 140 | compatibilityVersion = "Xcode 9.3"; 141 | developmentRegion = en; 142 | hasScannedForEncodings = 0; 143 | knownRegions = ( 144 | en, 145 | Base, 146 | ); 147 | mainGroup = 97C146E51CF9000F007C117D; 148 | productRefGroup = 97C146EF1CF9000F007C117D /* Products */; 149 | projectDirPath = ""; 150 | projectRoot = ""; 151 | targets = ( 152 | 97C146ED1CF9000F007C117D /* Runner */, 153 | ); 154 | }; 155 | /* End PBXProject section */ 156 | 157 | /* Begin PBXResourcesBuildPhase section */ 158 | 97C146EC1CF9000F007C117D /* Resources */ = { 159 | isa = PBXResourcesBuildPhase; 160 | buildActionMask = 2147483647; 161 | files = ( 162 | 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, 163 | 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, 164 | 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, 165 | 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, 166 | ); 167 | runOnlyForDeploymentPostprocessing = 0; 168 | }; 169 | /* End PBXResourcesBuildPhase section */ 170 | 171 | /* Begin PBXShellScriptBuildPhase section */ 172 | 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { 173 | isa = PBXShellScriptBuildPhase; 174 | buildActionMask = 2147483647; 175 | files = ( 176 | ); 177 | inputPaths = ( 178 | ); 179 | name = "Thin Binary"; 180 | outputPaths = ( 181 | ); 182 | runOnlyForDeploymentPostprocessing = 0; 183 | shellPath = /bin/sh; 184 | shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; 185 | }; 186 | 9740EEB61CF901F6004384FC /* Run Script */ = { 187 | isa = PBXShellScriptBuildPhase; 188 | buildActionMask = 2147483647; 189 | files = ( 190 | ); 191 | inputPaths = ( 192 | ); 193 | name = "Run Script"; 194 | outputPaths = ( 195 | ); 196 | runOnlyForDeploymentPostprocessing = 0; 197 | shellPath = /bin/sh; 198 | shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; 199 | }; 200 | /* End PBXShellScriptBuildPhase section */ 201 | 202 | /* Begin PBXSourcesBuildPhase section */ 203 | 97C146EA1CF9000F007C117D /* Sources */ = { 204 | isa = PBXSourcesBuildPhase; 205 | buildActionMask = 2147483647; 206 | files = ( 207 | 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */, 208 | 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */, 209 | ); 210 | runOnlyForDeploymentPostprocessing = 0; 211 | }; 212 | /* End PBXSourcesBuildPhase section */ 213 | 214 | /* Begin PBXVariantGroup section */ 215 | 97C146FA1CF9000F007C117D /* Main.storyboard */ = { 216 | isa = PBXVariantGroup; 217 | children = ( 218 | 97C146FB1CF9000F007C117D /* Base */, 219 | ); 220 | name = Main.storyboard; 221 | sourceTree = ""; 222 | }; 223 | 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = { 224 | isa = PBXVariantGroup; 225 | children = ( 226 | 97C147001CF9000F007C117D /* Base */, 227 | ); 228 | name = LaunchScreen.storyboard; 229 | sourceTree = ""; 230 | }; 231 | /* End PBXVariantGroup section */ 232 | 233 | /* Begin XCBuildConfiguration section */ 234 | 249021D3217E4FDB00AE95B9 /* Profile */ = { 235 | isa = XCBuildConfiguration; 236 | buildSettings = { 237 | ALWAYS_SEARCH_USER_PATHS = NO; 238 | CLANG_ANALYZER_NONNULL = YES; 239 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 240 | CLANG_CXX_LIBRARY = "libc++"; 241 | CLANG_ENABLE_MODULES = YES; 242 | CLANG_ENABLE_OBJC_ARC = YES; 243 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 244 | CLANG_WARN_BOOL_CONVERSION = YES; 245 | CLANG_WARN_COMMA = YES; 246 | CLANG_WARN_CONSTANT_CONVERSION = YES; 247 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 248 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 249 | CLANG_WARN_EMPTY_BODY = YES; 250 | CLANG_WARN_ENUM_CONVERSION = YES; 251 | CLANG_WARN_INFINITE_RECURSION = YES; 252 | CLANG_WARN_INT_CONVERSION = YES; 253 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 254 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 255 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 256 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 257 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 258 | CLANG_WARN_STRICT_PROTOTYPES = YES; 259 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 260 | CLANG_WARN_UNREACHABLE_CODE = YES; 261 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 262 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 263 | COPY_PHASE_STRIP = NO; 264 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 265 | ENABLE_NS_ASSERTIONS = NO; 266 | ENABLE_STRICT_OBJC_MSGSEND = YES; 267 | GCC_C_LANGUAGE_STANDARD = gnu99; 268 | GCC_NO_COMMON_BLOCKS = YES; 269 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 270 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 271 | GCC_WARN_UNDECLARED_SELECTOR = YES; 272 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 273 | GCC_WARN_UNUSED_FUNCTION = YES; 274 | GCC_WARN_UNUSED_VARIABLE = YES; 275 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 276 | MTL_ENABLE_DEBUG_INFO = NO; 277 | SDKROOT = iphoneos; 278 | SUPPORTED_PLATFORMS = iphoneos; 279 | TARGETED_DEVICE_FAMILY = "1,2"; 280 | VALIDATE_PRODUCT = YES; 281 | }; 282 | name = Profile; 283 | }; 284 | 249021D4217E4FDB00AE95B9 /* Profile */ = { 285 | isa = XCBuildConfiguration; 286 | baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; 287 | buildSettings = { 288 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 289 | CLANG_ENABLE_MODULES = YES; 290 | CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; 291 | ENABLE_BITCODE = NO; 292 | INFOPLIST_FILE = Runner/Info.plist; 293 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 294 | PRODUCT_BUNDLE_IDENTIFIER = com.example.serverDrivenUiDemo; 295 | PRODUCT_NAME = "$(TARGET_NAME)"; 296 | SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; 297 | SWIFT_VERSION = 5.0; 298 | VERSIONING_SYSTEM = "apple-generic"; 299 | }; 300 | name = Profile; 301 | }; 302 | 97C147031CF9000F007C117D /* Debug */ = { 303 | isa = XCBuildConfiguration; 304 | buildSettings = { 305 | ALWAYS_SEARCH_USER_PATHS = NO; 306 | CLANG_ANALYZER_NONNULL = YES; 307 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 308 | CLANG_CXX_LIBRARY = "libc++"; 309 | CLANG_ENABLE_MODULES = YES; 310 | CLANG_ENABLE_OBJC_ARC = YES; 311 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 312 | CLANG_WARN_BOOL_CONVERSION = YES; 313 | CLANG_WARN_COMMA = YES; 314 | CLANG_WARN_CONSTANT_CONVERSION = YES; 315 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 316 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 317 | CLANG_WARN_EMPTY_BODY = YES; 318 | CLANG_WARN_ENUM_CONVERSION = YES; 319 | CLANG_WARN_INFINITE_RECURSION = YES; 320 | CLANG_WARN_INT_CONVERSION = YES; 321 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 322 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 323 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 324 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 325 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 326 | CLANG_WARN_STRICT_PROTOTYPES = YES; 327 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 328 | CLANG_WARN_UNREACHABLE_CODE = YES; 329 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 330 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 331 | COPY_PHASE_STRIP = NO; 332 | DEBUG_INFORMATION_FORMAT = dwarf; 333 | ENABLE_STRICT_OBJC_MSGSEND = YES; 334 | ENABLE_TESTABILITY = YES; 335 | GCC_C_LANGUAGE_STANDARD = gnu99; 336 | GCC_DYNAMIC_NO_PIC = NO; 337 | GCC_NO_COMMON_BLOCKS = YES; 338 | GCC_OPTIMIZATION_LEVEL = 0; 339 | GCC_PREPROCESSOR_DEFINITIONS = ( 340 | "DEBUG=1", 341 | "$(inherited)", 342 | ); 343 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 344 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 345 | GCC_WARN_UNDECLARED_SELECTOR = YES; 346 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 347 | GCC_WARN_UNUSED_FUNCTION = YES; 348 | GCC_WARN_UNUSED_VARIABLE = YES; 349 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 350 | MTL_ENABLE_DEBUG_INFO = YES; 351 | ONLY_ACTIVE_ARCH = YES; 352 | SDKROOT = iphoneos; 353 | TARGETED_DEVICE_FAMILY = "1,2"; 354 | }; 355 | name = Debug; 356 | }; 357 | 97C147041CF9000F007C117D /* Release */ = { 358 | isa = XCBuildConfiguration; 359 | buildSettings = { 360 | ALWAYS_SEARCH_USER_PATHS = NO; 361 | CLANG_ANALYZER_NONNULL = YES; 362 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 363 | CLANG_CXX_LIBRARY = "libc++"; 364 | CLANG_ENABLE_MODULES = YES; 365 | CLANG_ENABLE_OBJC_ARC = YES; 366 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 367 | CLANG_WARN_BOOL_CONVERSION = YES; 368 | CLANG_WARN_COMMA = YES; 369 | CLANG_WARN_CONSTANT_CONVERSION = YES; 370 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 371 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 372 | CLANG_WARN_EMPTY_BODY = YES; 373 | CLANG_WARN_ENUM_CONVERSION = YES; 374 | CLANG_WARN_INFINITE_RECURSION = YES; 375 | CLANG_WARN_INT_CONVERSION = YES; 376 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 377 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 378 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 379 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 380 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 381 | CLANG_WARN_STRICT_PROTOTYPES = YES; 382 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 383 | CLANG_WARN_UNREACHABLE_CODE = YES; 384 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 385 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 386 | COPY_PHASE_STRIP = NO; 387 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 388 | ENABLE_NS_ASSERTIONS = NO; 389 | ENABLE_STRICT_OBJC_MSGSEND = YES; 390 | GCC_C_LANGUAGE_STANDARD = gnu99; 391 | GCC_NO_COMMON_BLOCKS = YES; 392 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 393 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 394 | GCC_WARN_UNDECLARED_SELECTOR = YES; 395 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 396 | GCC_WARN_UNUSED_FUNCTION = YES; 397 | GCC_WARN_UNUSED_VARIABLE = YES; 398 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; 399 | MTL_ENABLE_DEBUG_INFO = NO; 400 | SDKROOT = iphoneos; 401 | SUPPORTED_PLATFORMS = iphoneos; 402 | SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; 403 | TARGETED_DEVICE_FAMILY = "1,2"; 404 | VALIDATE_PRODUCT = YES; 405 | }; 406 | name = Release; 407 | }; 408 | 97C147061CF9000F007C117D /* Debug */ = { 409 | isa = XCBuildConfiguration; 410 | baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; 411 | buildSettings = { 412 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 413 | CLANG_ENABLE_MODULES = YES; 414 | CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; 415 | ENABLE_BITCODE = NO; 416 | INFOPLIST_FILE = Runner/Info.plist; 417 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 418 | PRODUCT_BUNDLE_IDENTIFIER = com.example.serverDrivenUiDemo; 419 | PRODUCT_NAME = "$(TARGET_NAME)"; 420 | SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; 421 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 422 | SWIFT_VERSION = 5.0; 423 | VERSIONING_SYSTEM = "apple-generic"; 424 | }; 425 | name = Debug; 426 | }; 427 | 97C147071CF9000F007C117D /* Release */ = { 428 | isa = XCBuildConfiguration; 429 | baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; 430 | buildSettings = { 431 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 432 | CLANG_ENABLE_MODULES = YES; 433 | CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; 434 | ENABLE_BITCODE = NO; 435 | INFOPLIST_FILE = Runner/Info.plist; 436 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 437 | PRODUCT_BUNDLE_IDENTIFIER = com.example.serverDrivenUiDemo; 438 | PRODUCT_NAME = "$(TARGET_NAME)"; 439 | SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; 440 | SWIFT_VERSION = 5.0; 441 | VERSIONING_SYSTEM = "apple-generic"; 442 | }; 443 | name = Release; 444 | }; 445 | /* End XCBuildConfiguration section */ 446 | 447 | /* Begin XCConfigurationList section */ 448 | 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = { 449 | isa = XCConfigurationList; 450 | buildConfigurations = ( 451 | 97C147031CF9000F007C117D /* Debug */, 452 | 97C147041CF9000F007C117D /* Release */, 453 | 249021D3217E4FDB00AE95B9 /* Profile */, 454 | ); 455 | defaultConfigurationIsVisible = 0; 456 | defaultConfigurationName = Release; 457 | }; 458 | 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = { 459 | isa = XCConfigurationList; 460 | buildConfigurations = ( 461 | 97C147061CF9000F007C117D /* Debug */, 462 | 97C147071CF9000F007C117D /* Release */, 463 | 249021D4217E4FDB00AE95B9 /* Profile */, 464 | ); 465 | defaultConfigurationIsVisible = 0; 466 | defaultConfigurationName = Release; 467 | }; 468 | /* End XCConfigurationList section */ 469 | }; 470 | rootObject = 97C146E61CF9000F007C117D /* Project object */; 471 | } 472 | -------------------------------------------------------------------------------- /server/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.28", 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", 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.7", 89 | "rand", 90 | "regex", 91 | "serde", 92 | "serde_json", 93 | "serde_urlencoded", 94 | "sha-1", 95 | "slab", 96 | "time 0.2.26", 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.7" 112 | source = "registry+https://github.com/rust-lang/crates.io-index" 113 | checksum = "2ad299af73649e1fc893e333ccf86f377751eb95ff875d095131574c6f43452c" 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.28", 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.28", 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.7", 257 | "regex", 258 | "serde", 259 | "serde_json", 260 | "serde_urlencoded", 261 | "socket2", 262 | "time 0.2.26", 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 = "adler" 280 | version = "1.0.2" 281 | source = "registry+https://github.com/rust-lang/crates.io-index" 282 | checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" 283 | 284 | [[package]] 285 | name = "aho-corasick" 286 | version = "0.7.15" 287 | source = "registry+https://github.com/rust-lang/crates.io-index" 288 | checksum = "7404febffaa47dac81aa44dba71523c9d069b1bdc50a77db41195149e17f68e5" 289 | dependencies = [ 290 | "memchr", 291 | ] 292 | 293 | [[package]] 294 | name = "ascii" 295 | version = "0.9.3" 296 | source = "registry+https://github.com/rust-lang/crates.io-index" 297 | checksum = "eab1c04a571841102f5345a8fc0f6bb3d31c315dec879b5c6e42e40ce7ffa34e" 298 | 299 | [[package]] 300 | name = "async-trait" 301 | version = "0.1.50" 302 | source = "registry+https://github.com/rust-lang/crates.io-index" 303 | checksum = "0b98e84bbb4cbcdd97da190ba0c58a1bb0de2c1fdf67d159e192ed766aeca722" 304 | dependencies = [ 305 | "proc-macro2", 306 | "quote", 307 | "syn", 308 | ] 309 | 310 | [[package]] 311 | name = "atty" 312 | version = "0.2.14" 313 | source = "registry+https://github.com/rust-lang/crates.io-index" 314 | checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" 315 | dependencies = [ 316 | "hermit-abi", 317 | "libc", 318 | "winapi 0.3.9", 319 | ] 320 | 321 | [[package]] 322 | name = "autocfg" 323 | version = "1.0.1" 324 | source = "registry+https://github.com/rust-lang/crates.io-index" 325 | checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a" 326 | 327 | [[package]] 328 | name = "awc" 329 | version = "2.0.3" 330 | source = "registry+https://github.com/rust-lang/crates.io-index" 331 | checksum = "b381e490e7b0cfc37ebc54079b0413d8093ef43d14a4e4747083f7fa47a9e691" 332 | dependencies = [ 333 | "actix-codec", 334 | "actix-http", 335 | "actix-rt", 336 | "actix-service", 337 | "base64", 338 | "bytes 0.5.6", 339 | "cfg-if 1.0.0", 340 | "derive_more", 341 | "futures-core", 342 | "log", 343 | "mime", 344 | "percent-encoding", 345 | "rand", 346 | "serde", 347 | "serde_json", 348 | "serde_urlencoded", 349 | ] 350 | 351 | [[package]] 352 | name = "base-x" 353 | version = "0.2.8" 354 | source = "registry+https://github.com/rust-lang/crates.io-index" 355 | checksum = "a4521f3e3d031370679b3b140beb36dfe4801b09ac77e30c61941f97df3ef28b" 356 | 357 | [[package]] 358 | name = "base64" 359 | version = "0.13.0" 360 | source = "registry+https://github.com/rust-lang/crates.io-index" 361 | checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd" 362 | 363 | [[package]] 364 | name = "bitflags" 365 | version = "1.2.1" 366 | source = "registry+https://github.com/rust-lang/crates.io-index" 367 | checksum = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693" 368 | 369 | [[package]] 370 | name = "block-buffer" 371 | version = "0.9.0" 372 | source = "registry+https://github.com/rust-lang/crates.io-index" 373 | checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" 374 | dependencies = [ 375 | "generic-array", 376 | ] 377 | 378 | [[package]] 379 | name = "brotli-sys" 380 | version = "0.3.2" 381 | source = "registry+https://github.com/rust-lang/crates.io-index" 382 | checksum = "4445dea95f4c2b41cde57cc9fee236ae4dbae88d8fcbdb4750fc1bb5d86aaecd" 383 | dependencies = [ 384 | "cc", 385 | "libc", 386 | ] 387 | 388 | [[package]] 389 | name = "brotli2" 390 | version = "0.3.2" 391 | source = "registry+https://github.com/rust-lang/crates.io-index" 392 | checksum = "0cb036c3eade309815c15ddbacec5b22c4d1f3983a774ab2eac2e3e9ea85568e" 393 | dependencies = [ 394 | "brotli-sys", 395 | "libc", 396 | ] 397 | 398 | [[package]] 399 | name = "bson" 400 | version = "1.2.2" 401 | source = "registry+https://github.com/rust-lang/crates.io-index" 402 | checksum = "38b6553abdb9d2d8f262f0b5bccf807321d5b7d1a12796bcede8e1f150e85f2e" 403 | dependencies = [ 404 | "base64", 405 | "chrono", 406 | "hex", 407 | "lazy_static", 408 | "linked-hash-map", 409 | "rand", 410 | "serde", 411 | "serde_json", 412 | "uuid", 413 | ] 414 | 415 | [[package]] 416 | name = "bumpalo" 417 | version = "3.6.1" 418 | source = "registry+https://github.com/rust-lang/crates.io-index" 419 | checksum = "63396b8a4b9de3f4fdfb320ab6080762242f66a8ef174c49d8e19b674db4cdbe" 420 | 421 | [[package]] 422 | name = "byteorder" 423 | version = "1.4.3" 424 | source = "registry+https://github.com/rust-lang/crates.io-index" 425 | checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" 426 | 427 | [[package]] 428 | name = "bytes" 429 | version = "0.5.6" 430 | source = "registry+https://github.com/rust-lang/crates.io-index" 431 | checksum = "0e4cec68f03f32e44924783795810fa50a7035d8c8ebe78580ad7e6c703fba38" 432 | 433 | [[package]] 434 | name = "bytes" 435 | version = "1.0.1" 436 | source = "registry+https://github.com/rust-lang/crates.io-index" 437 | checksum = "b700ce4376041dcd0a327fd0097c41095743c4c8af8887265942faf1100bd040" 438 | 439 | [[package]] 440 | name = "bytestring" 441 | version = "1.0.0" 442 | source = "registry+https://github.com/rust-lang/crates.io-index" 443 | checksum = "90706ba19e97b90786e19dc0d5e2abd80008d99d4c0c5d1ad0b5e72cec7c494d" 444 | dependencies = [ 445 | "bytes 1.0.1", 446 | ] 447 | 448 | [[package]] 449 | name = "cc" 450 | version = "1.0.67" 451 | source = "registry+https://github.com/rust-lang/crates.io-index" 452 | checksum = "e3c69b077ad434294d3ce9f1f6143a2a4b89a8a2d54ef813d85003a4fd1137fd" 453 | 454 | [[package]] 455 | name = "cfg-if" 456 | version = "0.1.10" 457 | source = "registry+https://github.com/rust-lang/crates.io-index" 458 | checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" 459 | 460 | [[package]] 461 | name = "cfg-if" 462 | version = "1.0.0" 463 | source = "registry+https://github.com/rust-lang/crates.io-index" 464 | checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" 465 | 466 | [[package]] 467 | name = "chrono" 468 | version = "0.4.19" 469 | source = "registry+https://github.com/rust-lang/crates.io-index" 470 | checksum = "670ad68c9088c2a963aaa298cb369688cf3f9465ce5e2d4ca10e6e0098a1ce73" 471 | dependencies = [ 472 | "libc", 473 | "num-integer", 474 | "num-traits", 475 | "time 0.1.44", 476 | "winapi 0.3.9", 477 | ] 478 | 479 | [[package]] 480 | name = "combine" 481 | version = "3.8.1" 482 | source = "registry+https://github.com/rust-lang/crates.io-index" 483 | checksum = "da3da6baa321ec19e1cc41d31bf599f00c783d0517095cdaf0332e3fe8d20680" 484 | dependencies = [ 485 | "ascii", 486 | "byteorder", 487 | "either", 488 | "memchr", 489 | "unreachable", 490 | ] 491 | 492 | [[package]] 493 | name = "const_fn" 494 | version = "0.4.7" 495 | source = "registry+https://github.com/rust-lang/crates.io-index" 496 | checksum = "402da840495de3f976eaefc3485b7f5eb5b0bf9761f9a47be27fe975b3b8c2ec" 497 | 498 | [[package]] 499 | name = "convert_case" 500 | version = "0.4.0" 501 | source = "registry+https://github.com/rust-lang/crates.io-index" 502 | checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" 503 | 504 | [[package]] 505 | name = "cookie" 506 | version = "0.14.4" 507 | source = "registry+https://github.com/rust-lang/crates.io-index" 508 | checksum = "03a5d7b21829bc7b4bf4754a978a241ae54ea55a40f92bb20216e54096f4b951" 509 | dependencies = [ 510 | "percent-encoding", 511 | "time 0.2.26", 512 | "version_check", 513 | ] 514 | 515 | [[package]] 516 | name = "copyless" 517 | version = "0.1.5" 518 | source = "registry+https://github.com/rust-lang/crates.io-index" 519 | checksum = "a2df960f5d869b2dd8532793fde43eb5427cceb126c929747a26823ab0eeb536" 520 | 521 | [[package]] 522 | name = "cpuid-bool" 523 | version = "0.1.2" 524 | source = "registry+https://github.com/rust-lang/crates.io-index" 525 | checksum = "8aebca1129a03dc6dc2b127edd729435bbc4a37e1d5f4d7513165089ceb02634" 526 | 527 | [[package]] 528 | name = "crc32fast" 529 | version = "1.2.1" 530 | source = "registry+https://github.com/rust-lang/crates.io-index" 531 | checksum = "81156fece84ab6a9f2afdb109ce3ae577e42b1228441eded99bd77f627953b1a" 532 | dependencies = [ 533 | "cfg-if 1.0.0", 534 | ] 535 | 536 | [[package]] 537 | name = "derive_more" 538 | version = "0.99.13" 539 | source = "registry+https://github.com/rust-lang/crates.io-index" 540 | checksum = "f82b1b72f1263f214c0f823371768776c4f5841b942c9883aa8e5ec584fd0ba6" 541 | dependencies = [ 542 | "convert_case", 543 | "proc-macro2", 544 | "quote", 545 | "syn", 546 | ] 547 | 548 | [[package]] 549 | name = "derive_utils" 550 | version = "0.11.2" 551 | source = "registry+https://github.com/rust-lang/crates.io-index" 552 | checksum = "532b4c15dccee12c7044f1fcad956e98410860b22231e44a3b827464797ca7bf" 553 | dependencies = [ 554 | "proc-macro2", 555 | "quote", 556 | "syn", 557 | ] 558 | 559 | [[package]] 560 | name = "digest" 561 | version = "0.9.0" 562 | source = "registry+https://github.com/rust-lang/crates.io-index" 563 | checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" 564 | dependencies = [ 565 | "generic-array", 566 | ] 567 | 568 | [[package]] 569 | name = "discard" 570 | version = "1.0.4" 571 | source = "registry+https://github.com/rust-lang/crates.io-index" 572 | checksum = "212d0f5754cb6769937f4501cc0e67f4f4483c8d2c3e1e922ee9edbe4ab4c7c0" 573 | 574 | [[package]] 575 | name = "either" 576 | version = "1.6.1" 577 | source = "registry+https://github.com/rust-lang/crates.io-index" 578 | checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457" 579 | 580 | [[package]] 581 | name = "encoding_rs" 582 | version = "0.8.28" 583 | source = "registry+https://github.com/rust-lang/crates.io-index" 584 | checksum = "80df024fbc5ac80f87dfef0d9f5209a252f2a497f7f42944cff24d8253cac065" 585 | dependencies = [ 586 | "cfg-if 1.0.0", 587 | ] 588 | 589 | [[package]] 590 | name = "enum-as-inner" 591 | version = "0.3.3" 592 | source = "registry+https://github.com/rust-lang/crates.io-index" 593 | checksum = "7c5f0096a91d210159eceb2ff5e1c4da18388a170e1e3ce948aac9c8fdbbf595" 594 | dependencies = [ 595 | "heck", 596 | "proc-macro2", 597 | "quote", 598 | "syn", 599 | ] 600 | 601 | [[package]] 602 | name = "env_logger" 603 | version = "0.8.3" 604 | source = "registry+https://github.com/rust-lang/crates.io-index" 605 | checksum = "17392a012ea30ef05a610aa97dfb49496e71c9f676b27879922ea5bdf60d9d3f" 606 | dependencies = [ 607 | "atty", 608 | "humantime", 609 | "log", 610 | "regex", 611 | "termcolor", 612 | ] 613 | 614 | [[package]] 615 | name = "flate2" 616 | version = "1.0.20" 617 | source = "registry+https://github.com/rust-lang/crates.io-index" 618 | checksum = "cd3aec53de10fe96d7d8c565eb17f2c687bb5518a2ec453b5b1252964526abe0" 619 | dependencies = [ 620 | "cfg-if 1.0.0", 621 | "crc32fast", 622 | "libc", 623 | "miniz_oxide", 624 | ] 625 | 626 | [[package]] 627 | name = "fnv" 628 | version = "1.0.7" 629 | source = "registry+https://github.com/rust-lang/crates.io-index" 630 | checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" 631 | 632 | [[package]] 633 | name = "form_urlencoded" 634 | version = "1.0.1" 635 | source = "registry+https://github.com/rust-lang/crates.io-index" 636 | checksum = "5fc25a87fa4fd2094bffb06925852034d90a17f0d1e05197d4956d3555752191" 637 | dependencies = [ 638 | "matches", 639 | "percent-encoding", 640 | ] 641 | 642 | [[package]] 643 | name = "fuchsia-zircon" 644 | version = "0.3.3" 645 | source = "registry+https://github.com/rust-lang/crates.io-index" 646 | checksum = "2e9763c69ebaae630ba35f74888db465e49e259ba1bc0eda7d06f4a067615d82" 647 | dependencies = [ 648 | "bitflags", 649 | "fuchsia-zircon-sys", 650 | ] 651 | 652 | [[package]] 653 | name = "fuchsia-zircon-sys" 654 | version = "0.3.3" 655 | source = "registry+https://github.com/rust-lang/crates.io-index" 656 | checksum = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7" 657 | 658 | [[package]] 659 | name = "futures" 660 | version = "0.3.14" 661 | source = "registry+https://github.com/rust-lang/crates.io-index" 662 | checksum = "a9d5813545e459ad3ca1bff9915e9ad7f1a47dc6a91b627ce321d5863b7dd253" 663 | dependencies = [ 664 | "futures-channel", 665 | "futures-core", 666 | "futures-io", 667 | "futures-sink", 668 | "futures-task", 669 | "futures-util", 670 | ] 671 | 672 | [[package]] 673 | name = "futures-channel" 674 | version = "0.3.14" 675 | source = "registry+https://github.com/rust-lang/crates.io-index" 676 | checksum = "ce79c6a52a299137a6013061e0cf0e688fce5d7f1bc60125f520912fdb29ec25" 677 | dependencies = [ 678 | "futures-core", 679 | "futures-sink", 680 | ] 681 | 682 | [[package]] 683 | name = "futures-core" 684 | version = "0.3.14" 685 | source = "registry+https://github.com/rust-lang/crates.io-index" 686 | checksum = "098cd1c6dda6ca01650f1a37a794245eb73181d0d4d4e955e2f3c37db7af1815" 687 | 688 | [[package]] 689 | name = "futures-enum" 690 | version = "0.1.17" 691 | source = "registry+https://github.com/rust-lang/crates.io-index" 692 | checksum = "3422d14de7903a52e9dbc10ae05a7e14445ec61890100e098754e120b2bd7b1e" 693 | dependencies = [ 694 | "derive_utils", 695 | "quote", 696 | "syn", 697 | ] 698 | 699 | [[package]] 700 | name = "futures-io" 701 | version = "0.3.14" 702 | source = "registry+https://github.com/rust-lang/crates.io-index" 703 | checksum = "365a1a1fb30ea1c03a830fdb2158f5236833ac81fa0ad12fe35b29cddc35cb04" 704 | 705 | [[package]] 706 | name = "futures-macro" 707 | version = "0.3.14" 708 | source = "registry+https://github.com/rust-lang/crates.io-index" 709 | checksum = "668c6733a182cd7deb4f1de7ba3bf2120823835b3bcfbeacf7d2c4a773c1bb8b" 710 | dependencies = [ 711 | "proc-macro-hack", 712 | "proc-macro2", 713 | "quote", 714 | "syn", 715 | ] 716 | 717 | [[package]] 718 | name = "futures-sink" 719 | version = "0.3.14" 720 | source = "registry+https://github.com/rust-lang/crates.io-index" 721 | checksum = "5c5629433c555de3d82861a7a4e3794a4c40040390907cfbfd7143a92a426c23" 722 | 723 | [[package]] 724 | name = "futures-task" 725 | version = "0.3.14" 726 | source = "registry+https://github.com/rust-lang/crates.io-index" 727 | checksum = "ba7aa51095076f3ba6d9a1f702f74bd05ec65f555d70d2033d55ba8d69f581bc" 728 | 729 | [[package]] 730 | name = "futures-util" 731 | version = "0.3.14" 732 | source = "registry+https://github.com/rust-lang/crates.io-index" 733 | checksum = "3c144ad54d60f23927f0a6b6d816e4271278b64f005ad65e4e35291d2de9c025" 734 | dependencies = [ 735 | "futures-channel", 736 | "futures-core", 737 | "futures-io", 738 | "futures-macro", 739 | "futures-sink", 740 | "futures-task", 741 | "memchr", 742 | "pin-project-lite 0.2.6", 743 | "pin-utils", 744 | "proc-macro-hack", 745 | "proc-macro-nested", 746 | "slab", 747 | ] 748 | 749 | [[package]] 750 | name = "fxhash" 751 | version = "0.2.1" 752 | source = "registry+https://github.com/rust-lang/crates.io-index" 753 | checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" 754 | dependencies = [ 755 | "byteorder", 756 | ] 757 | 758 | [[package]] 759 | name = "generic-array" 760 | version = "0.14.4" 761 | source = "registry+https://github.com/rust-lang/crates.io-index" 762 | checksum = "501466ecc8a30d1d3b7fc9229b122b2ce8ed6e9d9223f1138d4babb253e51817" 763 | dependencies = [ 764 | "typenum", 765 | "version_check", 766 | ] 767 | 768 | [[package]] 769 | name = "getrandom" 770 | version = "0.1.16" 771 | source = "registry+https://github.com/rust-lang/crates.io-index" 772 | checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" 773 | dependencies = [ 774 | "cfg-if 1.0.0", 775 | "libc", 776 | "wasi 0.9.0+wasi-snapshot-preview1", 777 | ] 778 | 779 | [[package]] 780 | name = "graphql-parser" 781 | version = "0.3.0" 782 | source = "registry+https://github.com/rust-lang/crates.io-index" 783 | checksum = "d1abd4ce5247dfc04a03ccde70f87a048458c9356c7e41d21ad8c407b3dde6f2" 784 | dependencies = [ 785 | "combine", 786 | "thiserror", 787 | ] 788 | 789 | [[package]] 790 | name = "h2" 791 | version = "0.2.7" 792 | source = "registry+https://github.com/rust-lang/crates.io-index" 793 | checksum = "5e4728fd124914ad25e99e3d15a9361a879f6620f63cb56bbb08f95abb97a535" 794 | dependencies = [ 795 | "bytes 0.5.6", 796 | "fnv", 797 | "futures-core", 798 | "futures-sink", 799 | "futures-util", 800 | "http", 801 | "indexmap", 802 | "slab", 803 | "tokio", 804 | "tokio-util", 805 | "tracing", 806 | "tracing-futures", 807 | ] 808 | 809 | [[package]] 810 | name = "hashbrown" 811 | version = "0.9.1" 812 | source = "registry+https://github.com/rust-lang/crates.io-index" 813 | checksum = "d7afe4a420e3fe79967a00898cc1f4db7c8a49a9333a29f8a4bd76a253d5cd04" 814 | 815 | [[package]] 816 | name = "heck" 817 | version = "0.3.2" 818 | source = "registry+https://github.com/rust-lang/crates.io-index" 819 | checksum = "87cbf45460356b7deeb5e3415b5563308c0a9b057c85e12b06ad551f98d0a6ac" 820 | dependencies = [ 821 | "unicode-segmentation", 822 | ] 823 | 824 | [[package]] 825 | name = "hermit-abi" 826 | version = "0.1.18" 827 | source = "registry+https://github.com/rust-lang/crates.io-index" 828 | checksum = "322f4de77956e22ed0e5032c359a0f1273f1f7f0d79bfa3b8ffbc730d7fbcc5c" 829 | dependencies = [ 830 | "libc", 831 | ] 832 | 833 | [[package]] 834 | name = "hex" 835 | version = "0.4.3" 836 | source = "registry+https://github.com/rust-lang/crates.io-index" 837 | checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" 838 | 839 | [[package]] 840 | name = "hostname" 841 | version = "0.3.1" 842 | source = "registry+https://github.com/rust-lang/crates.io-index" 843 | checksum = "3c731c3e10504cc8ed35cfe2f1db4c9274c3d35fa486e3b31df46f068ef3e867" 844 | dependencies = [ 845 | "libc", 846 | "match_cfg", 847 | "winapi 0.3.9", 848 | ] 849 | 850 | [[package]] 851 | name = "http" 852 | version = "0.2.4" 853 | source = "registry+https://github.com/rust-lang/crates.io-index" 854 | checksum = "527e8c9ac747e28542699a951517aa9a6945af506cd1f2e1b53a576c17b6cc11" 855 | dependencies = [ 856 | "bytes 1.0.1", 857 | "fnv", 858 | "itoa", 859 | ] 860 | 861 | [[package]] 862 | name = "httparse" 863 | version = "1.4.0" 864 | source = "registry+https://github.com/rust-lang/crates.io-index" 865 | checksum = "4a1ce40d6fc9764887c2fdc7305c3dcc429ba11ff981c1509416afd5697e4437" 866 | 867 | [[package]] 868 | name = "humantime" 869 | version = "2.1.0" 870 | source = "registry+https://github.com/rust-lang/crates.io-index" 871 | checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" 872 | 873 | [[package]] 874 | name = "idna" 875 | version = "0.2.3" 876 | source = "registry+https://github.com/rust-lang/crates.io-index" 877 | checksum = "418a0a6fab821475f634efe3ccc45c013f742efe03d853e8d3355d5cb850ecf8" 878 | dependencies = [ 879 | "matches", 880 | "unicode-bidi", 881 | "unicode-normalization", 882 | ] 883 | 884 | [[package]] 885 | name = "indexmap" 886 | version = "1.6.2" 887 | source = "registry+https://github.com/rust-lang/crates.io-index" 888 | checksum = "824845a0bf897a9042383849b02c1bc219c2383772efcd5c6f9766fa4b81aef3" 889 | dependencies = [ 890 | "autocfg", 891 | "hashbrown", 892 | "serde", 893 | ] 894 | 895 | [[package]] 896 | name = "instant" 897 | version = "0.1.9" 898 | source = "registry+https://github.com/rust-lang/crates.io-index" 899 | checksum = "61124eeebbd69b8190558df225adf7e4caafce0d743919e5d6b19652314ec5ec" 900 | dependencies = [ 901 | "cfg-if 1.0.0", 902 | ] 903 | 904 | [[package]] 905 | name = "iovec" 906 | version = "0.1.4" 907 | source = "registry+https://github.com/rust-lang/crates.io-index" 908 | checksum = "b2b3ea6ff95e175473f8ffe6a7eb7c00d054240321b84c57051175fe3c1e075e" 909 | dependencies = [ 910 | "libc", 911 | ] 912 | 913 | [[package]] 914 | name = "ipconfig" 915 | version = "0.2.2" 916 | source = "registry+https://github.com/rust-lang/crates.io-index" 917 | checksum = "f7e2f18aece9709094573a9f24f483c4f65caa4298e2f7ae1b71cc65d853fad7" 918 | dependencies = [ 919 | "socket2", 920 | "widestring", 921 | "winapi 0.3.9", 922 | "winreg", 923 | ] 924 | 925 | [[package]] 926 | name = "itoa" 927 | version = "0.4.7" 928 | source = "registry+https://github.com/rust-lang/crates.io-index" 929 | checksum = "dd25036021b0de88a0aff6b850051563c6516d0bf53f8638938edbb9de732736" 930 | 931 | [[package]] 932 | name = "juniper" 933 | version = "0.15.4" 934 | source = "registry+https://github.com/rust-lang/crates.io-index" 935 | checksum = "4e1330b4b3b2fe7de256fd08738f7fba28ffa574109c834988c28972f0760dbd" 936 | dependencies = [ 937 | "async-trait", 938 | "bson", 939 | "chrono", 940 | "fnv", 941 | "futures", 942 | "futures-enum", 943 | "graphql-parser", 944 | "indexmap", 945 | "juniper_codegen", 946 | "serde", 947 | "smartstring", 948 | "static_assertions", 949 | "url", 950 | "uuid", 951 | ] 952 | 953 | [[package]] 954 | name = "juniper_codegen" 955 | version = "0.15.4" 956 | source = "registry+https://github.com/rust-lang/crates.io-index" 957 | checksum = "3faf2a1e2e86cadc6bcc6082d63c73e8eafe6b703a0c5723e585b3d4afcec9cd" 958 | dependencies = [ 959 | "proc-macro-error", 960 | "proc-macro2", 961 | "quote", 962 | "syn", 963 | ] 964 | 965 | [[package]] 966 | name = "kernel32-sys" 967 | version = "0.2.2" 968 | source = "registry+https://github.com/rust-lang/crates.io-index" 969 | checksum = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d" 970 | dependencies = [ 971 | "winapi 0.2.8", 972 | "winapi-build", 973 | ] 974 | 975 | [[package]] 976 | name = "language-tags" 977 | version = "0.2.2" 978 | source = "registry+https://github.com/rust-lang/crates.io-index" 979 | checksum = "a91d884b6667cd606bb5a69aa0c99ba811a115fc68915e7056ec08a46e93199a" 980 | 981 | [[package]] 982 | name = "lazy_static" 983 | version = "1.4.0" 984 | source = "registry+https://github.com/rust-lang/crates.io-index" 985 | checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" 986 | 987 | [[package]] 988 | name = "libc" 989 | version = "0.2.94" 990 | source = "registry+https://github.com/rust-lang/crates.io-index" 991 | checksum = "18794a8ad5b29321f790b55d93dfba91e125cb1a9edbd4f8e3150acc771c1a5e" 992 | 993 | [[package]] 994 | name = "linked-hash-map" 995 | version = "0.5.4" 996 | source = "registry+https://github.com/rust-lang/crates.io-index" 997 | checksum = "7fb9b38af92608140b86b693604b9ffcc5824240a484d1ecd4795bacb2fe88f3" 998 | 999 | [[package]] 1000 | name = "lock_api" 1001 | version = "0.4.3" 1002 | source = "registry+https://github.com/rust-lang/crates.io-index" 1003 | checksum = "5a3c91c24eae6777794bb1997ad98bbb87daf92890acab859f7eaa4320333176" 1004 | dependencies = [ 1005 | "scopeguard", 1006 | ] 1007 | 1008 | [[package]] 1009 | name = "log" 1010 | version = "0.4.14" 1011 | source = "registry+https://github.com/rust-lang/crates.io-index" 1012 | checksum = "51b9bbe6c47d51fc3e1a9b945965946b4c44142ab8792c50835a980d362c2710" 1013 | dependencies = [ 1014 | "cfg-if 1.0.0", 1015 | ] 1016 | 1017 | [[package]] 1018 | name = "lru-cache" 1019 | version = "0.1.2" 1020 | source = "registry+https://github.com/rust-lang/crates.io-index" 1021 | checksum = "31e24f1ad8321ca0e8a1e0ac13f23cb668e6f5466c2c57319f6a5cf1cc8e3b1c" 1022 | dependencies = [ 1023 | "linked-hash-map", 1024 | ] 1025 | 1026 | [[package]] 1027 | name = "match_cfg" 1028 | version = "0.1.0" 1029 | source = "registry+https://github.com/rust-lang/crates.io-index" 1030 | checksum = "ffbee8634e0d45d258acb448e7eaab3fce7a0a467395d4d9f228e3c1f01fb2e4" 1031 | 1032 | [[package]] 1033 | name = "matches" 1034 | version = "0.1.8" 1035 | source = "registry+https://github.com/rust-lang/crates.io-index" 1036 | checksum = "7ffc5c5338469d4d3ea17d269fa8ea3512ad247247c30bd2df69e68309ed0a08" 1037 | 1038 | [[package]] 1039 | name = "memchr" 1040 | version = "2.3.4" 1041 | source = "registry+https://github.com/rust-lang/crates.io-index" 1042 | checksum = "0ee1c47aaa256ecabcaea351eae4a9b01ef39ed810004e298d2511ed284b1525" 1043 | 1044 | [[package]] 1045 | name = "mime" 1046 | version = "0.3.16" 1047 | source = "registry+https://github.com/rust-lang/crates.io-index" 1048 | checksum = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d" 1049 | 1050 | [[package]] 1051 | name = "miniz_oxide" 1052 | version = "0.4.4" 1053 | source = "registry+https://github.com/rust-lang/crates.io-index" 1054 | checksum = "a92518e98c078586bc6c934028adcca4c92a53d6a958196de835170a01d84e4b" 1055 | dependencies = [ 1056 | "adler", 1057 | "autocfg", 1058 | ] 1059 | 1060 | [[package]] 1061 | name = "mio" 1062 | version = "0.6.23" 1063 | source = "registry+https://github.com/rust-lang/crates.io-index" 1064 | checksum = "4afd66f5b91bf2a3bc13fad0e21caedac168ca4c707504e75585648ae80e4cc4" 1065 | dependencies = [ 1066 | "cfg-if 0.1.10", 1067 | "fuchsia-zircon", 1068 | "fuchsia-zircon-sys", 1069 | "iovec", 1070 | "kernel32-sys", 1071 | "libc", 1072 | "log", 1073 | "miow", 1074 | "net2", 1075 | "slab", 1076 | "winapi 0.2.8", 1077 | ] 1078 | 1079 | [[package]] 1080 | name = "mio-uds" 1081 | version = "0.6.8" 1082 | source = "registry+https://github.com/rust-lang/crates.io-index" 1083 | checksum = "afcb699eb26d4332647cc848492bbc15eafb26f08d0304550d5aa1f612e066f0" 1084 | dependencies = [ 1085 | "iovec", 1086 | "libc", 1087 | "mio", 1088 | ] 1089 | 1090 | [[package]] 1091 | name = "miow" 1092 | version = "0.2.2" 1093 | source = "registry+https://github.com/rust-lang/crates.io-index" 1094 | checksum = "ebd808424166322d4a38da87083bfddd3ac4c131334ed55856112eb06d46944d" 1095 | dependencies = [ 1096 | "kernel32-sys", 1097 | "net2", 1098 | "winapi 0.2.8", 1099 | "ws2_32-sys", 1100 | ] 1101 | 1102 | [[package]] 1103 | name = "net2" 1104 | version = "0.2.37" 1105 | source = "registry+https://github.com/rust-lang/crates.io-index" 1106 | checksum = "391630d12b68002ae1e25e8f974306474966550ad82dac6886fb8910c19568ae" 1107 | dependencies = [ 1108 | "cfg-if 0.1.10", 1109 | "libc", 1110 | "winapi 0.3.9", 1111 | ] 1112 | 1113 | [[package]] 1114 | name = "num-integer" 1115 | version = "0.1.44" 1116 | source = "registry+https://github.com/rust-lang/crates.io-index" 1117 | checksum = "d2cc698a63b549a70bc047073d2949cce27cd1c7b0a4a862d08a8031bc2801db" 1118 | dependencies = [ 1119 | "autocfg", 1120 | "num-traits", 1121 | ] 1122 | 1123 | [[package]] 1124 | name = "num-traits" 1125 | version = "0.2.14" 1126 | source = "registry+https://github.com/rust-lang/crates.io-index" 1127 | checksum = "9a64b1ec5cda2586e284722486d802acf1f7dbdc623e2bfc57e65ca1cd099290" 1128 | dependencies = [ 1129 | "autocfg", 1130 | ] 1131 | 1132 | [[package]] 1133 | name = "num_cpus" 1134 | version = "1.13.0" 1135 | source = "registry+https://github.com/rust-lang/crates.io-index" 1136 | checksum = "05499f3756671c15885fee9034446956fff3f243d6077b91e5767df161f766b3" 1137 | dependencies = [ 1138 | "hermit-abi", 1139 | "libc", 1140 | ] 1141 | 1142 | [[package]] 1143 | name = "once_cell" 1144 | version = "1.7.2" 1145 | source = "registry+https://github.com/rust-lang/crates.io-index" 1146 | checksum = "af8b08b04175473088b46763e51ee54da5f9a164bc162f615b91bc179dbf15a3" 1147 | 1148 | [[package]] 1149 | name = "opaque-debug" 1150 | version = "0.3.0" 1151 | source = "registry+https://github.com/rust-lang/crates.io-index" 1152 | checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" 1153 | 1154 | [[package]] 1155 | name = "parking_lot" 1156 | version = "0.11.1" 1157 | source = "registry+https://github.com/rust-lang/crates.io-index" 1158 | checksum = "6d7744ac029df22dca6284efe4e898991d28e3085c706c972bcd7da4a27a15eb" 1159 | dependencies = [ 1160 | "instant", 1161 | "lock_api", 1162 | "parking_lot_core", 1163 | ] 1164 | 1165 | [[package]] 1166 | name = "parking_lot_core" 1167 | version = "0.8.3" 1168 | source = "registry+https://github.com/rust-lang/crates.io-index" 1169 | checksum = "fa7a782938e745763fe6907fc6ba86946d72f49fe7e21de074e08128a99fb018" 1170 | dependencies = [ 1171 | "cfg-if 1.0.0", 1172 | "instant", 1173 | "libc", 1174 | "redox_syscall", 1175 | "smallvec", 1176 | "winapi 0.3.9", 1177 | ] 1178 | 1179 | [[package]] 1180 | name = "percent-encoding" 1181 | version = "2.1.0" 1182 | source = "registry+https://github.com/rust-lang/crates.io-index" 1183 | checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e" 1184 | 1185 | [[package]] 1186 | name = "pin-project" 1187 | version = "0.4.28" 1188 | source = "registry+https://github.com/rust-lang/crates.io-index" 1189 | checksum = "918192b5c59119d51e0cd221f4d49dde9112824ba717369e903c97d076083d0f" 1190 | dependencies = [ 1191 | "pin-project-internal 0.4.28", 1192 | ] 1193 | 1194 | [[package]] 1195 | name = "pin-project" 1196 | version = "1.0.7" 1197 | source = "registry+https://github.com/rust-lang/crates.io-index" 1198 | checksum = "c7509cc106041c40a4518d2af7a61530e1eed0e6285296a3d8c5472806ccc4a4" 1199 | dependencies = [ 1200 | "pin-project-internal 1.0.7", 1201 | ] 1202 | 1203 | [[package]] 1204 | name = "pin-project-internal" 1205 | version = "0.4.28" 1206 | source = "registry+https://github.com/rust-lang/crates.io-index" 1207 | checksum = "3be26700300be6d9d23264c73211d8190e755b6b5ca7a1b28230025511b52a5e" 1208 | dependencies = [ 1209 | "proc-macro2", 1210 | "quote", 1211 | "syn", 1212 | ] 1213 | 1214 | [[package]] 1215 | name = "pin-project-internal" 1216 | version = "1.0.7" 1217 | source = "registry+https://github.com/rust-lang/crates.io-index" 1218 | checksum = "48c950132583b500556b1efd71d45b319029f2b71518d979fcc208e16b42426f" 1219 | dependencies = [ 1220 | "proc-macro2", 1221 | "quote", 1222 | "syn", 1223 | ] 1224 | 1225 | [[package]] 1226 | name = "pin-project-lite" 1227 | version = "0.1.12" 1228 | source = "registry+https://github.com/rust-lang/crates.io-index" 1229 | checksum = "257b64915a082f7811703966789728173279bdebb956b143dbcd23f6f970a777" 1230 | 1231 | [[package]] 1232 | name = "pin-project-lite" 1233 | version = "0.2.6" 1234 | source = "registry+https://github.com/rust-lang/crates.io-index" 1235 | checksum = "dc0e1f259c92177c30a4c9d177246edd0a3568b25756a977d0632cf8fa37e905" 1236 | 1237 | [[package]] 1238 | name = "pin-utils" 1239 | version = "0.1.0" 1240 | source = "registry+https://github.com/rust-lang/crates.io-index" 1241 | checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" 1242 | 1243 | [[package]] 1244 | name = "ppv-lite86" 1245 | version = "0.2.10" 1246 | source = "registry+https://github.com/rust-lang/crates.io-index" 1247 | checksum = "ac74c624d6b2d21f425f752262f42188365d7b8ff1aff74c82e45136510a4857" 1248 | 1249 | [[package]] 1250 | name = "proc-macro-error" 1251 | version = "1.0.4" 1252 | source = "registry+https://github.com/rust-lang/crates.io-index" 1253 | checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" 1254 | dependencies = [ 1255 | "proc-macro-error-attr", 1256 | "proc-macro2", 1257 | "quote", 1258 | "syn", 1259 | "version_check", 1260 | ] 1261 | 1262 | [[package]] 1263 | name = "proc-macro-error-attr" 1264 | version = "1.0.4" 1265 | source = "registry+https://github.com/rust-lang/crates.io-index" 1266 | checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" 1267 | dependencies = [ 1268 | "proc-macro2", 1269 | "quote", 1270 | "version_check", 1271 | ] 1272 | 1273 | [[package]] 1274 | name = "proc-macro-hack" 1275 | version = "0.5.19" 1276 | source = "registry+https://github.com/rust-lang/crates.io-index" 1277 | checksum = "dbf0c48bc1d91375ae5c3cd81e3722dff1abcf81a30960240640d223f59fe0e5" 1278 | 1279 | [[package]] 1280 | name = "proc-macro-nested" 1281 | version = "0.1.7" 1282 | source = "registry+https://github.com/rust-lang/crates.io-index" 1283 | checksum = "bc881b2c22681370c6a780e47af9840ef841837bc98118431d4e1868bd0c1086" 1284 | 1285 | [[package]] 1286 | name = "proc-macro2" 1287 | version = "1.0.26" 1288 | source = "registry+https://github.com/rust-lang/crates.io-index" 1289 | checksum = "a152013215dca273577e18d2bf00fa862b89b24169fb78c4c95aeb07992c9cec" 1290 | dependencies = [ 1291 | "unicode-xid", 1292 | ] 1293 | 1294 | [[package]] 1295 | name = "quick-error" 1296 | version = "1.2.3" 1297 | source = "registry+https://github.com/rust-lang/crates.io-index" 1298 | checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" 1299 | 1300 | [[package]] 1301 | name = "quote" 1302 | version = "1.0.9" 1303 | source = "registry+https://github.com/rust-lang/crates.io-index" 1304 | checksum = "c3d0b9745dc2debf507c8422de05d7226cc1f0644216dfdfead988f9b1ab32a7" 1305 | dependencies = [ 1306 | "proc-macro2", 1307 | ] 1308 | 1309 | [[package]] 1310 | name = "rand" 1311 | version = "0.7.3" 1312 | source = "registry+https://github.com/rust-lang/crates.io-index" 1313 | checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" 1314 | dependencies = [ 1315 | "getrandom", 1316 | "libc", 1317 | "rand_chacha", 1318 | "rand_core", 1319 | "rand_hc", 1320 | ] 1321 | 1322 | [[package]] 1323 | name = "rand_chacha" 1324 | version = "0.2.2" 1325 | source = "registry+https://github.com/rust-lang/crates.io-index" 1326 | checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" 1327 | dependencies = [ 1328 | "ppv-lite86", 1329 | "rand_core", 1330 | ] 1331 | 1332 | [[package]] 1333 | name = "rand_core" 1334 | version = "0.5.1" 1335 | source = "registry+https://github.com/rust-lang/crates.io-index" 1336 | checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" 1337 | dependencies = [ 1338 | "getrandom", 1339 | ] 1340 | 1341 | [[package]] 1342 | name = "rand_hc" 1343 | version = "0.2.0" 1344 | source = "registry+https://github.com/rust-lang/crates.io-index" 1345 | checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" 1346 | dependencies = [ 1347 | "rand_core", 1348 | ] 1349 | 1350 | [[package]] 1351 | name = "redox_syscall" 1352 | version = "0.2.7" 1353 | source = "registry+https://github.com/rust-lang/crates.io-index" 1354 | checksum = "85dd92e586f7355c633911e11f77f3d12f04b1b1bd76a198bd34ae3af8341ef2" 1355 | dependencies = [ 1356 | "bitflags", 1357 | ] 1358 | 1359 | [[package]] 1360 | name = "regex" 1361 | version = "1.4.6" 1362 | source = "registry+https://github.com/rust-lang/crates.io-index" 1363 | checksum = "2a26af418b574bd56588335b3a3659a65725d4e636eb1016c2f9e3b38c7cc759" 1364 | dependencies = [ 1365 | "aho-corasick", 1366 | "memchr", 1367 | "regex-syntax", 1368 | ] 1369 | 1370 | [[package]] 1371 | name = "regex-syntax" 1372 | version = "0.6.23" 1373 | source = "registry+https://github.com/rust-lang/crates.io-index" 1374 | checksum = "24d5f089152e60f62d28b835fbff2cd2e8dc0baf1ac13343bef92ab7eed84548" 1375 | 1376 | [[package]] 1377 | name = "resolv-conf" 1378 | version = "0.7.0" 1379 | source = "registry+https://github.com/rust-lang/crates.io-index" 1380 | checksum = "52e44394d2086d010551b14b53b1f24e31647570cd1deb0379e2c21b329aba00" 1381 | dependencies = [ 1382 | "hostname", 1383 | "quick-error", 1384 | ] 1385 | 1386 | [[package]] 1387 | name = "rustc_version" 1388 | version = "0.2.3" 1389 | source = "registry+https://github.com/rust-lang/crates.io-index" 1390 | checksum = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" 1391 | dependencies = [ 1392 | "semver", 1393 | ] 1394 | 1395 | [[package]] 1396 | name = "ryu" 1397 | version = "1.0.5" 1398 | source = "registry+https://github.com/rust-lang/crates.io-index" 1399 | checksum = "71d301d4193d031abdd79ff7e3dd721168a9572ef3fe51a1517aba235bd8f86e" 1400 | 1401 | [[package]] 1402 | name = "scopeguard" 1403 | version = "1.1.0" 1404 | source = "registry+https://github.com/rust-lang/crates.io-index" 1405 | checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" 1406 | 1407 | [[package]] 1408 | name = "semver" 1409 | version = "0.9.0" 1410 | source = "registry+https://github.com/rust-lang/crates.io-index" 1411 | checksum = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" 1412 | dependencies = [ 1413 | "semver-parser", 1414 | ] 1415 | 1416 | [[package]] 1417 | name = "semver-parser" 1418 | version = "0.7.0" 1419 | source = "registry+https://github.com/rust-lang/crates.io-index" 1420 | checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" 1421 | 1422 | [[package]] 1423 | name = "serde" 1424 | version = "1.0.125" 1425 | source = "registry+https://github.com/rust-lang/crates.io-index" 1426 | checksum = "558dc50e1a5a5fa7112ca2ce4effcb321b0300c0d4ccf0776a9f60cd89031171" 1427 | dependencies = [ 1428 | "serde_derive", 1429 | ] 1430 | 1431 | [[package]] 1432 | name = "serde_derive" 1433 | version = "1.0.125" 1434 | source = "registry+https://github.com/rust-lang/crates.io-index" 1435 | checksum = "b093b7a2bb58203b5da3056c05b4ec1fed827dcfdb37347a8841695263b3d06d" 1436 | dependencies = [ 1437 | "proc-macro2", 1438 | "quote", 1439 | "syn", 1440 | ] 1441 | 1442 | [[package]] 1443 | name = "serde_json" 1444 | version = "1.0.64" 1445 | source = "registry+https://github.com/rust-lang/crates.io-index" 1446 | checksum = "799e97dc9fdae36a5c8b8f2cae9ce2ee9fdce2058c57a93e6099d919fd982f79" 1447 | dependencies = [ 1448 | "indexmap", 1449 | "itoa", 1450 | "ryu", 1451 | "serde", 1452 | ] 1453 | 1454 | [[package]] 1455 | name = "serde_urlencoded" 1456 | version = "0.7.0" 1457 | source = "registry+https://github.com/rust-lang/crates.io-index" 1458 | checksum = "edfa57a7f8d9c1d260a549e7224100f6c43d43f9103e06dd8b4095a9b2b43ce9" 1459 | dependencies = [ 1460 | "form_urlencoded", 1461 | "itoa", 1462 | "ryu", 1463 | "serde", 1464 | ] 1465 | 1466 | [[package]] 1467 | name = "server-driven-ui-demo" 1468 | version = "0.1.0" 1469 | dependencies = [ 1470 | "actix-cors", 1471 | "actix-web", 1472 | "derive_more", 1473 | "env_logger", 1474 | "juniper", 1475 | "serde", 1476 | "serde_derive", 1477 | "serde_json", 1478 | ] 1479 | 1480 | [[package]] 1481 | name = "sha-1" 1482 | version = "0.9.4" 1483 | source = "registry+https://github.com/rust-lang/crates.io-index" 1484 | checksum = "dfebf75d25bd900fd1e7d11501efab59bc846dbc76196839663e6637bba9f25f" 1485 | dependencies = [ 1486 | "block-buffer", 1487 | "cfg-if 1.0.0", 1488 | "cpuid-bool", 1489 | "digest", 1490 | "opaque-debug", 1491 | ] 1492 | 1493 | [[package]] 1494 | name = "sha1" 1495 | version = "0.6.0" 1496 | source = "registry+https://github.com/rust-lang/crates.io-index" 1497 | checksum = "2579985fda508104f7587689507983eadd6a6e84dd35d6d115361f530916fa0d" 1498 | 1499 | [[package]] 1500 | name = "signal-hook-registry" 1501 | version = "1.3.0" 1502 | source = "registry+https://github.com/rust-lang/crates.io-index" 1503 | checksum = "16f1d0fef1604ba8f7a073c7e701f213e056707210e9020af4528e0101ce11a6" 1504 | dependencies = [ 1505 | "libc", 1506 | ] 1507 | 1508 | [[package]] 1509 | name = "slab" 1510 | version = "0.4.3" 1511 | source = "registry+https://github.com/rust-lang/crates.io-index" 1512 | checksum = "f173ac3d1a7e3b28003f40de0b5ce7fe2710f9b9dc3fc38664cebee46b3b6527" 1513 | 1514 | [[package]] 1515 | name = "smallvec" 1516 | version = "1.6.1" 1517 | source = "registry+https://github.com/rust-lang/crates.io-index" 1518 | checksum = "fe0f37c9e8f3c5a4a66ad655a93c74daac4ad00c441533bf5c6e7990bb42604e" 1519 | 1520 | [[package]] 1521 | name = "smartstring" 1522 | version = "0.2.6" 1523 | source = "registry+https://github.com/rust-lang/crates.io-index" 1524 | checksum = "1ada87540bf8ef4cf8a1789deb175626829bb59b1fefd816cf7f7f55efcdbae9" 1525 | dependencies = [ 1526 | "static_assertions", 1527 | ] 1528 | 1529 | [[package]] 1530 | name = "socket2" 1531 | version = "0.3.19" 1532 | source = "registry+https://github.com/rust-lang/crates.io-index" 1533 | checksum = "122e570113d28d773067fab24266b66753f6ea915758651696b6e35e49f88d6e" 1534 | dependencies = [ 1535 | "cfg-if 1.0.0", 1536 | "libc", 1537 | "winapi 0.3.9", 1538 | ] 1539 | 1540 | [[package]] 1541 | name = "standback" 1542 | version = "0.2.17" 1543 | source = "registry+https://github.com/rust-lang/crates.io-index" 1544 | checksum = "e113fb6f3de07a243d434a56ec6f186dfd51cb08448239fe7bcae73f87ff28ff" 1545 | dependencies = [ 1546 | "version_check", 1547 | ] 1548 | 1549 | [[package]] 1550 | name = "static_assertions" 1551 | version = "1.1.0" 1552 | source = "registry+https://github.com/rust-lang/crates.io-index" 1553 | checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" 1554 | 1555 | [[package]] 1556 | name = "stdweb" 1557 | version = "0.4.20" 1558 | source = "registry+https://github.com/rust-lang/crates.io-index" 1559 | checksum = "d022496b16281348b52d0e30ae99e01a73d737b2f45d38fed4edf79f9325a1d5" 1560 | dependencies = [ 1561 | "discard", 1562 | "rustc_version", 1563 | "stdweb-derive", 1564 | "stdweb-internal-macros", 1565 | "stdweb-internal-runtime", 1566 | "wasm-bindgen", 1567 | ] 1568 | 1569 | [[package]] 1570 | name = "stdweb-derive" 1571 | version = "0.5.3" 1572 | source = "registry+https://github.com/rust-lang/crates.io-index" 1573 | checksum = "c87a60a40fccc84bef0652345bbbbbe20a605bf5d0ce81719fc476f5c03b50ef" 1574 | dependencies = [ 1575 | "proc-macro2", 1576 | "quote", 1577 | "serde", 1578 | "serde_derive", 1579 | "syn", 1580 | ] 1581 | 1582 | [[package]] 1583 | name = "stdweb-internal-macros" 1584 | version = "0.2.9" 1585 | source = "registry+https://github.com/rust-lang/crates.io-index" 1586 | checksum = "58fa5ff6ad0d98d1ffa8cb115892b6e69d67799f6763e162a1c9db421dc22e11" 1587 | dependencies = [ 1588 | "base-x", 1589 | "proc-macro2", 1590 | "quote", 1591 | "serde", 1592 | "serde_derive", 1593 | "serde_json", 1594 | "sha1", 1595 | "syn", 1596 | ] 1597 | 1598 | [[package]] 1599 | name = "stdweb-internal-runtime" 1600 | version = "0.1.5" 1601 | source = "registry+https://github.com/rust-lang/crates.io-index" 1602 | checksum = "213701ba3370744dcd1a12960caa4843b3d68b4d1c0a5d575e0d65b2ee9d16c0" 1603 | 1604 | [[package]] 1605 | name = "syn" 1606 | version = "1.0.71" 1607 | source = "registry+https://github.com/rust-lang/crates.io-index" 1608 | checksum = "ad184cc9470f9117b2ac6817bfe297307418819ba40552f9b3846f05c33d5373" 1609 | dependencies = [ 1610 | "proc-macro2", 1611 | "quote", 1612 | "unicode-xid", 1613 | ] 1614 | 1615 | [[package]] 1616 | name = "termcolor" 1617 | version = "1.1.2" 1618 | source = "registry+https://github.com/rust-lang/crates.io-index" 1619 | checksum = "2dfed899f0eb03f32ee8c6a0aabdb8a7949659e3466561fc0adf54e26d88c5f4" 1620 | dependencies = [ 1621 | "winapi-util", 1622 | ] 1623 | 1624 | [[package]] 1625 | name = "thiserror" 1626 | version = "1.0.24" 1627 | source = "registry+https://github.com/rust-lang/crates.io-index" 1628 | checksum = "e0f4a65597094d4483ddaed134f409b2cb7c1beccf25201a9f73c719254fa98e" 1629 | dependencies = [ 1630 | "thiserror-impl", 1631 | ] 1632 | 1633 | [[package]] 1634 | name = "thiserror-impl" 1635 | version = "1.0.24" 1636 | source = "registry+https://github.com/rust-lang/crates.io-index" 1637 | checksum = "7765189610d8241a44529806d6fd1f2e0a08734313a35d5b3a556f92b381f3c0" 1638 | dependencies = [ 1639 | "proc-macro2", 1640 | "quote", 1641 | "syn", 1642 | ] 1643 | 1644 | [[package]] 1645 | name = "threadpool" 1646 | version = "1.8.1" 1647 | source = "registry+https://github.com/rust-lang/crates.io-index" 1648 | checksum = "d050e60b33d41c19108b32cea32164033a9013fe3b46cbd4457559bfbf77afaa" 1649 | dependencies = [ 1650 | "num_cpus", 1651 | ] 1652 | 1653 | [[package]] 1654 | name = "time" 1655 | version = "0.1.44" 1656 | source = "registry+https://github.com/rust-lang/crates.io-index" 1657 | checksum = "6db9e6914ab8b1ae1c260a4ae7a49b6c5611b40328a735b21862567685e73255" 1658 | dependencies = [ 1659 | "libc", 1660 | "wasi 0.10.0+wasi-snapshot-preview1", 1661 | "winapi 0.3.9", 1662 | ] 1663 | 1664 | [[package]] 1665 | name = "time" 1666 | version = "0.2.26" 1667 | source = "registry+https://github.com/rust-lang/crates.io-index" 1668 | checksum = "08a8cbfbf47955132d0202d1662f49b2423ae35862aee471f3ba4b133358f372" 1669 | dependencies = [ 1670 | "const_fn", 1671 | "libc", 1672 | "standback", 1673 | "stdweb", 1674 | "time-macros", 1675 | "version_check", 1676 | "winapi 0.3.9", 1677 | ] 1678 | 1679 | [[package]] 1680 | name = "time-macros" 1681 | version = "0.1.1" 1682 | source = "registry+https://github.com/rust-lang/crates.io-index" 1683 | checksum = "957e9c6e26f12cb6d0dd7fc776bb67a706312e7299aed74c8dd5b17ebb27e2f1" 1684 | dependencies = [ 1685 | "proc-macro-hack", 1686 | "time-macros-impl", 1687 | ] 1688 | 1689 | [[package]] 1690 | name = "time-macros-impl" 1691 | version = "0.1.1" 1692 | source = "registry+https://github.com/rust-lang/crates.io-index" 1693 | checksum = "e5c3be1edfad6027c69f5491cf4cb310d1a71ecd6af742788c6ff8bced86b8fa" 1694 | dependencies = [ 1695 | "proc-macro-hack", 1696 | "proc-macro2", 1697 | "quote", 1698 | "standback", 1699 | "syn", 1700 | ] 1701 | 1702 | [[package]] 1703 | name = "tinyvec" 1704 | version = "1.2.0" 1705 | source = "registry+https://github.com/rust-lang/crates.io-index" 1706 | checksum = "5b5220f05bb7de7f3f53c7c065e1199b3172696fe2db9f9c4d8ad9b4ee74c342" 1707 | dependencies = [ 1708 | "tinyvec_macros", 1709 | ] 1710 | 1711 | [[package]] 1712 | name = "tinyvec_macros" 1713 | version = "0.1.0" 1714 | source = "registry+https://github.com/rust-lang/crates.io-index" 1715 | checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" 1716 | 1717 | [[package]] 1718 | name = "tokio" 1719 | version = "0.2.25" 1720 | source = "registry+https://github.com/rust-lang/crates.io-index" 1721 | checksum = "6703a273949a90131b290be1fe7b039d0fc884aa1935860dfcbe056f28cd8092" 1722 | dependencies = [ 1723 | "bytes 0.5.6", 1724 | "futures-core", 1725 | "iovec", 1726 | "lazy_static", 1727 | "libc", 1728 | "memchr", 1729 | "mio", 1730 | "mio-uds", 1731 | "pin-project-lite 0.1.12", 1732 | "signal-hook-registry", 1733 | "slab", 1734 | "winapi 0.3.9", 1735 | ] 1736 | 1737 | [[package]] 1738 | name = "tokio-util" 1739 | version = "0.3.1" 1740 | source = "registry+https://github.com/rust-lang/crates.io-index" 1741 | checksum = "be8242891f2b6cbef26a2d7e8605133c2c554cd35b3e4948ea892d6d68436499" 1742 | dependencies = [ 1743 | "bytes 0.5.6", 1744 | "futures-core", 1745 | "futures-sink", 1746 | "log", 1747 | "pin-project-lite 0.1.12", 1748 | "tokio", 1749 | ] 1750 | 1751 | [[package]] 1752 | name = "tracing" 1753 | version = "0.1.25" 1754 | source = "registry+https://github.com/rust-lang/crates.io-index" 1755 | checksum = "01ebdc2bb4498ab1ab5f5b73c5803825e60199229ccba0698170e3be0e7f959f" 1756 | dependencies = [ 1757 | "cfg-if 1.0.0", 1758 | "log", 1759 | "pin-project-lite 0.2.6", 1760 | "tracing-core", 1761 | ] 1762 | 1763 | [[package]] 1764 | name = "tracing-core" 1765 | version = "0.1.17" 1766 | source = "registry+https://github.com/rust-lang/crates.io-index" 1767 | checksum = "f50de3927f93d202783f4513cda820ab47ef17f624b03c096e86ef00c67e6b5f" 1768 | dependencies = [ 1769 | "lazy_static", 1770 | ] 1771 | 1772 | [[package]] 1773 | name = "tracing-futures" 1774 | version = "0.2.5" 1775 | source = "registry+https://github.com/rust-lang/crates.io-index" 1776 | checksum = "97d095ae15e245a057c8e8451bab9b3ee1e1f68e9ba2b4fbc18d0ac5237835f2" 1777 | dependencies = [ 1778 | "pin-project 1.0.7", 1779 | "tracing", 1780 | ] 1781 | 1782 | [[package]] 1783 | name = "trust-dns-proto" 1784 | version = "0.19.7" 1785 | source = "registry+https://github.com/rust-lang/crates.io-index" 1786 | checksum = "1cad71a0c0d68ab9941d2fb6e82f8fb2e86d9945b94e1661dd0aaea2b88215a9" 1787 | dependencies = [ 1788 | "async-trait", 1789 | "cfg-if 1.0.0", 1790 | "enum-as-inner", 1791 | "futures", 1792 | "idna", 1793 | "lazy_static", 1794 | "log", 1795 | "rand", 1796 | "smallvec", 1797 | "thiserror", 1798 | "tokio", 1799 | "url", 1800 | ] 1801 | 1802 | [[package]] 1803 | name = "trust-dns-resolver" 1804 | version = "0.19.7" 1805 | source = "registry+https://github.com/rust-lang/crates.io-index" 1806 | checksum = "710f593b371175db53a26d0b38ed2978fafb9e9e8d3868b1acd753ea18df0ceb" 1807 | dependencies = [ 1808 | "cfg-if 0.1.10", 1809 | "futures", 1810 | "ipconfig", 1811 | "lazy_static", 1812 | "log", 1813 | "lru-cache", 1814 | "resolv-conf", 1815 | "smallvec", 1816 | "thiserror", 1817 | "tokio", 1818 | "trust-dns-proto", 1819 | ] 1820 | 1821 | [[package]] 1822 | name = "typenum" 1823 | version = "1.13.0" 1824 | source = "registry+https://github.com/rust-lang/crates.io-index" 1825 | checksum = "879f6906492a7cd215bfa4cf595b600146ccfac0c79bcbd1f3000162af5e8b06" 1826 | 1827 | [[package]] 1828 | name = "unicode-bidi" 1829 | version = "0.3.5" 1830 | source = "registry+https://github.com/rust-lang/crates.io-index" 1831 | checksum = "eeb8be209bb1c96b7c177c7420d26e04eccacb0eeae6b980e35fcb74678107e0" 1832 | dependencies = [ 1833 | "matches", 1834 | ] 1835 | 1836 | [[package]] 1837 | name = "unicode-normalization" 1838 | version = "0.1.17" 1839 | source = "registry+https://github.com/rust-lang/crates.io-index" 1840 | checksum = "07fbfce1c8a97d547e8b5334978438d9d6ec8c20e38f56d4a4374d181493eaef" 1841 | dependencies = [ 1842 | "tinyvec", 1843 | ] 1844 | 1845 | [[package]] 1846 | name = "unicode-segmentation" 1847 | version = "1.7.1" 1848 | source = "registry+https://github.com/rust-lang/crates.io-index" 1849 | checksum = "bb0d2e7be6ae3a5fa87eed5fb451aff96f2573d2694942e40543ae0bbe19c796" 1850 | 1851 | [[package]] 1852 | name = "unicode-xid" 1853 | version = "0.2.1" 1854 | source = "registry+https://github.com/rust-lang/crates.io-index" 1855 | checksum = "f7fe0bb3479651439c9112f72b6c505038574c9fbb575ed1bf3b797fa39dd564" 1856 | 1857 | [[package]] 1858 | name = "unreachable" 1859 | version = "1.0.0" 1860 | source = "registry+https://github.com/rust-lang/crates.io-index" 1861 | checksum = "382810877fe448991dfc7f0dd6e3ae5d58088fd0ea5e35189655f84e6814fa56" 1862 | dependencies = [ 1863 | "void", 1864 | ] 1865 | 1866 | [[package]] 1867 | name = "url" 1868 | version = "2.2.1" 1869 | source = "registry+https://github.com/rust-lang/crates.io-index" 1870 | checksum = "9ccd964113622c8e9322cfac19eb1004a07e636c545f325da085d5cdde6f1f8b" 1871 | dependencies = [ 1872 | "form_urlencoded", 1873 | "idna", 1874 | "matches", 1875 | "percent-encoding", 1876 | ] 1877 | 1878 | [[package]] 1879 | name = "uuid" 1880 | version = "0.8.2" 1881 | source = "registry+https://github.com/rust-lang/crates.io-index" 1882 | checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7" 1883 | 1884 | [[package]] 1885 | name = "version_check" 1886 | version = "0.9.3" 1887 | source = "registry+https://github.com/rust-lang/crates.io-index" 1888 | checksum = "5fecdca9a5291cc2b8dcf7dc02453fee791a280f3743cb0905f8822ae463b3fe" 1889 | 1890 | [[package]] 1891 | name = "void" 1892 | version = "1.0.2" 1893 | source = "registry+https://github.com/rust-lang/crates.io-index" 1894 | checksum = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" 1895 | 1896 | [[package]] 1897 | name = "wasi" 1898 | version = "0.9.0+wasi-snapshot-preview1" 1899 | source = "registry+https://github.com/rust-lang/crates.io-index" 1900 | checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" 1901 | 1902 | [[package]] 1903 | name = "wasi" 1904 | version = "0.10.0+wasi-snapshot-preview1" 1905 | source = "registry+https://github.com/rust-lang/crates.io-index" 1906 | checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f" 1907 | 1908 | [[package]] 1909 | name = "wasm-bindgen" 1910 | version = "0.2.73" 1911 | source = "registry+https://github.com/rust-lang/crates.io-index" 1912 | checksum = "83240549659d187488f91f33c0f8547cbfef0b2088bc470c116d1d260ef623d9" 1913 | dependencies = [ 1914 | "cfg-if 1.0.0", 1915 | "wasm-bindgen-macro", 1916 | ] 1917 | 1918 | [[package]] 1919 | name = "wasm-bindgen-backend" 1920 | version = "0.2.73" 1921 | source = "registry+https://github.com/rust-lang/crates.io-index" 1922 | checksum = "ae70622411ca953215ca6d06d3ebeb1e915f0f6613e3b495122878d7ebec7dae" 1923 | dependencies = [ 1924 | "bumpalo", 1925 | "lazy_static", 1926 | "log", 1927 | "proc-macro2", 1928 | "quote", 1929 | "syn", 1930 | "wasm-bindgen-shared", 1931 | ] 1932 | 1933 | [[package]] 1934 | name = "wasm-bindgen-macro" 1935 | version = "0.2.73" 1936 | source = "registry+https://github.com/rust-lang/crates.io-index" 1937 | checksum = "3e734d91443f177bfdb41969de821e15c516931c3c3db3d318fa1b68975d0f6f" 1938 | dependencies = [ 1939 | "quote", 1940 | "wasm-bindgen-macro-support", 1941 | ] 1942 | 1943 | [[package]] 1944 | name = "wasm-bindgen-macro-support" 1945 | version = "0.2.73" 1946 | source = "registry+https://github.com/rust-lang/crates.io-index" 1947 | checksum = "d53739ff08c8a68b0fdbcd54c372b8ab800b1449ab3c9d706503bc7dd1621b2c" 1948 | dependencies = [ 1949 | "proc-macro2", 1950 | "quote", 1951 | "syn", 1952 | "wasm-bindgen-backend", 1953 | "wasm-bindgen-shared", 1954 | ] 1955 | 1956 | [[package]] 1957 | name = "wasm-bindgen-shared" 1958 | version = "0.2.73" 1959 | source = "registry+https://github.com/rust-lang/crates.io-index" 1960 | checksum = "d9a543ae66aa233d14bb765ed9af4a33e81b8b58d1584cf1b47ff8cd0b9e4489" 1961 | 1962 | [[package]] 1963 | name = "widestring" 1964 | version = "0.4.3" 1965 | source = "registry+https://github.com/rust-lang/crates.io-index" 1966 | checksum = "c168940144dd21fd8046987c16a46a33d5fc84eec29ef9dcddc2ac9e31526b7c" 1967 | 1968 | [[package]] 1969 | name = "winapi" 1970 | version = "0.2.8" 1971 | source = "registry+https://github.com/rust-lang/crates.io-index" 1972 | checksum = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a" 1973 | 1974 | [[package]] 1975 | name = "winapi" 1976 | version = "0.3.9" 1977 | source = "registry+https://github.com/rust-lang/crates.io-index" 1978 | checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" 1979 | dependencies = [ 1980 | "winapi-i686-pc-windows-gnu", 1981 | "winapi-x86_64-pc-windows-gnu", 1982 | ] 1983 | 1984 | [[package]] 1985 | name = "winapi-build" 1986 | version = "0.1.1" 1987 | source = "registry+https://github.com/rust-lang/crates.io-index" 1988 | checksum = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc" 1989 | 1990 | [[package]] 1991 | name = "winapi-i686-pc-windows-gnu" 1992 | version = "0.4.0" 1993 | source = "registry+https://github.com/rust-lang/crates.io-index" 1994 | checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" 1995 | 1996 | [[package]] 1997 | name = "winapi-util" 1998 | version = "0.1.5" 1999 | source = "registry+https://github.com/rust-lang/crates.io-index" 2000 | checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" 2001 | dependencies = [ 2002 | "winapi 0.3.9", 2003 | ] 2004 | 2005 | [[package]] 2006 | name = "winapi-x86_64-pc-windows-gnu" 2007 | version = "0.4.0" 2008 | source = "registry+https://github.com/rust-lang/crates.io-index" 2009 | checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" 2010 | 2011 | [[package]] 2012 | name = "winreg" 2013 | version = "0.6.2" 2014 | source = "registry+https://github.com/rust-lang/crates.io-index" 2015 | checksum = "b2986deb581c4fe11b621998a5e53361efe6b48a151178d0cd9eeffa4dc6acc9" 2016 | dependencies = [ 2017 | "winapi 0.3.9", 2018 | ] 2019 | 2020 | [[package]] 2021 | name = "ws2_32-sys" 2022 | version = "0.2.1" 2023 | source = "registry+https://github.com/rust-lang/crates.io-index" 2024 | checksum = "d59cefebd0c892fa2dd6de581e937301d8552cb44489cdff035c6187cb63fa5e" 2025 | dependencies = [ 2026 | "winapi 0.2.8", 2027 | "winapi-build", 2028 | ] 2029 | --------------------------------------------------------------------------------