Skip to content
This repository has been archived by the owner on Jun 29, 2023. It is now read-only.

Commit

Permalink
can get schema
Browse files Browse the repository at this point in the history
  • Loading branch information
kjuulh committed Jan 28, 2023
1 parent 83ecbd2 commit 06fd730
Show file tree
Hide file tree
Showing 6 changed files with 333 additions and 49 deletions.
68 changes: 39 additions & 29 deletions src/cli_session.rs
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
use core::time;
use std::{
fs::canonicalize,
io::{BufRead, BufReader},
path::PathBuf,
process::Stdio,
sync::Arc,
process::{Child, Stdio},
sync::{mpsc::sync_channel, Arc},
thread::sleep,
};

use crate::{config::Config, connect_params::ConnectParams};
Expand All @@ -20,7 +22,11 @@ impl CliSession {
}
}

pub fn connect(&self, config: &Config, cli_path: &PathBuf) -> eyre::Result<ConnectParams> {
pub fn connect(
&self,
config: &Config,
cli_path: &PathBuf,
) -> eyre::Result<(ConnectParams, Child)> {
self.inner.connect(config, cli_path)
}
}
Expand All @@ -29,9 +35,13 @@ impl CliSession {
struct InnerCliSession {}

impl InnerCliSession {
pub fn connect(&self, config: &Config, cli_path: &PathBuf) -> eyre::Result<ConnectParams> {
let mut proc = self.start(config, cli_path)?;
let params = self.get_conn(&mut proc)?;
pub fn connect(
&self,
config: &Config,
cli_path: &PathBuf,
) -> eyre::Result<(ConnectParams, Child)> {
let proc = self.start(config, cli_path)?;
let params = self.get_conn(proc)?;
Ok(params)
}

Expand Down Expand Up @@ -62,7 +72,10 @@ impl InnerCliSession {
return Ok(proc);
}

fn get_conn(&self, proc: &mut std::process::Child) -> eyre::Result<ConnectParams> {
fn get_conn(
&self,
mut proc: std::process::Child,
) -> eyre::Result<(ConnectParams, std::process::Child)> {
let stdout = proc
.stdout
.take()
Expand All @@ -73,31 +86,28 @@ impl InnerCliSession {
.take()
.ok_or(eyre::anyhow!("could not acquire stderr from child process"))?;

let mut conn: Option<ConnectParams> = None;

std::thread::scope(|s| {
s.spawn(|| {
let stdout_bufr = BufReader::new(stdout);
let mut res_conn: Option<ConnectParams> = None;
for line in stdout_bufr.lines() {
let out = line.unwrap();
let conn: ConnectParams = serde_json::from_str(&out).unwrap();
res_conn = Some(conn);
break;
}
let (sender, receiver) = sync_channel(1);

conn = res_conn;
});
std::thread::spawn(move || {
let stdout_bufr = BufReader::new(stdout);
for line in stdout_bufr.lines() {
let out = line.unwrap();
if let Ok(conn) = serde_json::from_str::<ConnectParams>(&out) {
sender.send(conn).unwrap();
}
}
});

//s.spawn(|| {
// let stderr_bufr = BufReader::new(stderr);
// for line in stderr_bufr.lines() {
// let out = line.unwrap();
// panic!("could not start dagger session: {}", out)
// }
//});
std::thread::spawn(|| {
let stderr_bufr = BufReader::new(stderr);
for line in stderr_bufr.lines() {
let out = line.unwrap();
panic!("could not start dagger session: {}", out)
}
});

Ok(conn.ok_or(eyre::anyhow!("could not connect to dagger"))?)
let conn = receiver.recv()?;

Ok((conn, proc))
}
}
8 changes: 5 additions & 3 deletions src/engine.rs
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
use std::process::Child;

use crate::{
cli_session::CliSession, config::Config, connect_params::ConnectParams, downloader::Downloader,
};
Expand All @@ -9,15 +11,15 @@ impl Engine {
Self {}
}

fn from_cli(&self, cfg: &Config) -> eyre::Result<ConnectParams> {
fn from_cli(&self, cfg: &Config) -> eyre::Result<(ConnectParams, Child)> {
let cli = Downloader::new("0.3.10".into())?.get_cli()?;

let cli_session = CliSession::new();

Ok(cli_session.connect(cfg, &cli)?)
}

pub fn start(&self, cfg: &Config) -> eyre::Result<ConnectParams> {
pub fn start(&self, cfg: &Config) -> eyre::Result<(ConnectParams, Child)> {
// TODO: Add from existing session as well
self.from_cli(cfg)
}
Expand All @@ -36,7 +38,7 @@ mod tests {
let params = engine.start(&Config::new(None, None, None, None)).unwrap();

assert_ne!(
params,
params.0,
ConnectParams {
port: 123,
session_token: "123".into()
Expand Down
99 changes: 99 additions & 0 deletions src/graphql/introspection_query.graphql
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
query IntrospectionQuery {
__schema {
queryType {
name
}
mutationType {
name
}
subscriptionType {
name
}
types {
...FullType
}
directives {
name
description
locations
args {
...InputValue
}
}
}
}

fragment FullType on __Type {
kind
name
description
fields(includeDeprecated: true) {
name
description
args {
...InputValue
}
type {
...TypeRef
}
isDeprecated
deprecationReason
}
inputFields {
...InputValue
}
interfaces {
...TypeRef
}
enumValues(includeDeprecated: true) {
name
description
isDeprecated
deprecationReason
}
possibleTypes {
...TypeRef
}
}

fragment InputValue on __InputValue {
name
description
type {
...TypeRef
}
defaultValue
}

fragment TypeRef on __Type {
kind
name
ofType {
kind
name
ofType {
kind
name
ofType {
kind
name
ofType {
kind
name
ofType {
kind
name
ofType {
kind
name
ofType {
kind
name
}
}
}
}
}
}
}
}
101 changes: 101 additions & 0 deletions src/graphql/introspection_schema.graphql
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
schema {
query: Query
}

type Query {
__schema: __Schema
}

type __Schema {
types: [__Type!]!
queryType: __Type!
mutationType: __Type
subscriptionType: __Type
directives: [__Directive!]!
}

type __Type {
kind: __TypeKind!
name: String
description: String

# OBJECT and INTERFACE only
fields(includeDeprecated: Boolean = false): [__Field!]

# OBJECT only
interfaces: [__Type!]

# INTERFACE and UNION only
possibleTypes: [__Type!]

# ENUM only
enumValues(includeDeprecated: Boolean = false): [__EnumValue!]

# INPUT_OBJECT only
inputFields: [__InputValue!]

# NON_NULL and LIST only
ofType: __Type
}

type __Field {
name: String!
description: String
args: [__InputValue!]!
type: __Type!
isDeprecated: Boolean!
deprecationReason: String
}

type __InputValue {
name: String!
description: String
type: __Type!
defaultValue: String
}

type __EnumValue {
name: String!
description: String
isDeprecated: Boolean!
deprecationReason: String
}

enum __TypeKind {
SCALAR
OBJECT
INTERFACE
UNION
ENUM
INPUT_OBJECT
LIST
NON_NULL
}

type __Directive {
name: String!
description: String
locations: [__DirectiveLocation!]!
args: [__InputValue!]!
}

enum __DirectiveLocation {
QUERY
MUTATION
SUBSCRIPTION
FIELD
FRAGMENT_DEFINITION
FRAGMENT_SPREAD
INLINE_FRAGMENT
SCHEMA
SCALAR
OBJECT
FIELD_DEFINITION
ARGUMENT_DEFINITION
INTERFACE
UNION
ENUM
ENUM_VALUE
INPUT_OBJECT
INPUT_FIELD_DEFINITION
}
27 changes: 27 additions & 0 deletions src/schema.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
use core::time;
use std::thread::sleep;

use graphql_introspection_query::introspection_response::IntrospectionResponse;

use crate::{config::Config, engine::Engine, session::Session};

pub fn get_schema() -> eyre::Result<IntrospectionResponse> {
//TODO: Implement cotext for proc
let cfg = Config::new(None, None, None, None);
let (conn, proc) = Engine::new().start(&cfg)?;
let session = Session::new();
let req_builder = session.start(cfg, &conn)?;
let schema = session.schema(req_builder)?;

Ok(schema)
}

#[cfg(test)]
mod tests {
use super::get_schema;

#[test]
fn can_get_schema() {
let _ = get_schema().unwrap();
}
}
Loading

0 comments on commit 06fd730

Please sign in to comment.