Skip to content

Commit 4da2d50

Browse files
committed
Implement the first version of functions table
1 parent e88a97a commit 4da2d50

File tree

11 files changed

+2262
-2
lines changed

11 files changed

+2262
-2
lines changed

Cargo.lock

Lines changed: 1270 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,19 @@ license = "MIT"
88
repository = "https://github.com/amrdeveloper/pyql/"
99
documentation = "https://github.com/amrdeveloper/pyql"
1010
readme = "README.md"
11-
keywords = ["python code", "pyql", "language", "gitql", "llvm"]
11+
keywords = ["python", "pyql", "language", "gitql", "llvm"]
1212
categories = ["command-line-utilities"]
1313
exclude = [".github/**", "docs/**", "media/**", "scripts/**"]
1414

1515
[dependencies]
16+
gitql-core = "0.9.0"
17+
gitql-std = "0.9.0"
18+
gitql-ast = "0.29.0"
19+
gitql-parser = "0.31.0"
20+
gitql-engine = "0.32.0"
21+
gitql-cli = "0.32.0"
22+
lineeditor = "0.4.1"
23+
rustpython-parser = "0.4.0"
1624

1725
[profile.release]
1826
lto = true

src/arguments.rs

Lines changed: 192 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,192 @@
1+
use gitql_cli::arguments::OutputFormat;
2+
3+
/// Arguments for PyQL
4+
#[derive(Debug, PartialEq)]
5+
pub struct Arguments {
6+
pub files: Vec<String>,
7+
pub analysis: bool,
8+
pub pagination: bool,
9+
pub page_size: usize,
10+
pub enable_line_editor: bool,
11+
pub output_format: OutputFormat,
12+
}
13+
14+
/// Create a new instance of Arguments with the default settings
15+
impl Arguments {
16+
fn new() -> Arguments {
17+
Arguments {
18+
files: vec![],
19+
analysis: false,
20+
pagination: false,
21+
page_size: 10,
22+
enable_line_editor: false,
23+
output_format: OutputFormat::Render,
24+
}
25+
}
26+
}
27+
28+
#[derive(Debug, PartialEq)]
29+
pub enum Command {
30+
ReplMode(Arguments),
31+
QueryMode(String, Arguments),
32+
ScriptMode(String, Arguments),
33+
Help,
34+
Version,
35+
Error(String),
36+
}
37+
38+
pub fn parse_arguments(args: &[String]) -> Command {
39+
let args_len = args.len();
40+
41+
if args.iter().any(|i| i == "--help" || i == "-h") {
42+
return Command::Help;
43+
}
44+
45+
if args.iter().any(|i| i == "--version" || i == "-v") {
46+
return Command::Version;
47+
}
48+
49+
let mut optional_query: Option<String> = None;
50+
let mut optional_script_file: Option<String> = None;
51+
let mut arguments = Arguments::new();
52+
53+
let mut arg_index = 1;
54+
loop {
55+
if arg_index >= args_len {
56+
break;
57+
}
58+
59+
let arg = &args[arg_index];
60+
61+
if !arg.starts_with('-') {
62+
return Command::Error(format!("Unknown argument {}", arg));
63+
}
64+
65+
match arg.as_ref() {
66+
"--files" | "-f" => {
67+
arg_index += 1;
68+
if arg_index >= args_len {
69+
let message = format!("Argument {} must be followed by one or more path", arg);
70+
return Command::Error(message);
71+
}
72+
73+
loop {
74+
if arg_index >= args_len {
75+
break;
76+
}
77+
78+
let files = &args[arg_index];
79+
if !files.starts_with('-') {
80+
arguments.files.push(files.to_string());
81+
arg_index += 1;
82+
continue;
83+
}
84+
85+
break;
86+
}
87+
88+
if arguments.files.is_empty() {
89+
return Command::Error("Must provide one or more C/C++ files".to_string());
90+
}
91+
}
92+
"--query" | "-q" => {
93+
arg_index += 1;
94+
if arg_index >= args_len {
95+
let message = format!("Argument {} must be followed by the query", arg);
96+
return Command::Error(message);
97+
}
98+
99+
optional_query = Some(args[arg_index].to_string());
100+
arg_index += 1;
101+
}
102+
"--script" | "-s" => {
103+
arg_index += 1;
104+
if arg_index >= args_len {
105+
let message = format!("Argument {} must be followed by the file", arg);
106+
return Command::Error(message);
107+
}
108+
109+
optional_script_file = Some(args[arg_index].to_string());
110+
arg_index += 1;
111+
}
112+
"--analysis" | "-a" => {
113+
arguments.analysis = true;
114+
arg_index += 1;
115+
}
116+
"--pagination" | "-p" => {
117+
arguments.pagination = true;
118+
arg_index += 1;
119+
}
120+
"--pagesize" | "-ps" => {
121+
arg_index += 1;
122+
if arg_index >= args_len {
123+
let message = format!("Argument {} must be followed by the page size", arg);
124+
return Command::Error(message);
125+
}
126+
127+
let page_size_result = args[arg_index].parse::<usize>();
128+
if page_size_result.is_err() {
129+
return Command::Error("Invalid page size".to_string());
130+
}
131+
132+
let page_size = page_size_result.ok().unwrap();
133+
arguments.page_size = page_size;
134+
arg_index += 1;
135+
}
136+
"--editor" | "-e" => {
137+
arguments.enable_line_editor = true;
138+
arg_index += 1;
139+
}
140+
"--output" | "-o" => {
141+
arg_index += 1;
142+
if arg_index >= args_len {
143+
let message = format!("Argument {} must be followed by output format", arg);
144+
return Command::Error(message);
145+
}
146+
147+
let output_type = &args[arg_index].to_lowercase();
148+
if output_type == "csv" {
149+
arguments.output_format = OutputFormat::CSV;
150+
} else if output_type == "json" {
151+
arguments.output_format = OutputFormat::JSON;
152+
} else if output_type == "render" {
153+
arguments.output_format = OutputFormat::Render;
154+
} else {
155+
return Command::Error("Invalid output format".to_string());
156+
}
157+
158+
arg_index += 1;
159+
}
160+
_ => return Command::Error(format!("Unknown command {}", arg)),
161+
}
162+
}
163+
164+
if arguments.files.is_empty() {
165+
return Command::Error("Must provide one or more LLVM IR or BC files".to_string());
166+
}
167+
168+
if let Some(script_file) = optional_script_file {
169+
Command::ScriptMode(script_file, arguments)
170+
} else if let Some(query) = optional_query {
171+
Command::QueryMode(query, arguments)
172+
} else {
173+
Command::ReplMode(arguments)
174+
}
175+
}
176+
177+
pub fn print_help_list() {
178+
println!("PyQL is a SQL like query language to run on local files");
179+
println!();
180+
println!("Usage: PyQL [OPTIONS]");
181+
println!();
182+
println!("Options:");
183+
println!("-f, --files <paths> Path for local files to run query on");
184+
println!("-s, --script <file> Script file contains one or more query");
185+
println!("-q, --query <GQL Query> PyQL query to run on selected repositories");
186+
println!("-p, --pagination Enable print result with pagination");
187+
println!("-ps, --pagesize Set pagination page size [default: 10]");
188+
println!("-o, --output Set output format [render, json, csv]");
189+
println!("-a, --analysis Print Query analysis");
190+
println!("-h, --help Print PyQL help");
191+
println!("-v, --version Print PyQL Current Version");
192+
}

0 commit comments

Comments
 (0)