Cadabra
Computer algebra system for field theory problems
Loading...
Searching...
No Matches
cadabra2-cli.hh
Go to the documentation of this file.
1#include <string>
2#include <memory>
3
4// Work around MSVC linking problem
5#ifdef _DEBUG
6#define CADABRA_CLI_DEBUG_MARKER
7#undef _DEBUG
8#endif
9//#include <Python.h>
10#include <pybind11/pybind11.h>
11#include <pybind11/embed.h>
12#ifdef CADABRA_CLI_DEBUG_MARKER
13#define _DEBUG
14#undef CADABRA_CLI_DEBUG_MARKER
15#endif
16
17class Shell : public pybind11::scoped_interpreter {
18 public:
19 enum class Flags : unsigned int {
20 None = 0x00,
21 NoBanner = 0x01,
23 NoColour = 0x04,
24 NoReadline = 0x08,
25 };
26
28 ~Shell();
29
30 void start();
31 void interact();
32 pybind11::object evaluate(const std::string& code, const std::string& filename = "<stdin>");
33 void execute(const std::string& code, const std::string& filename = "<stdin>");
34 void execute_file(const std::string& filename, bool preprocess = true);
35 void interact_file(const std::string& filename, bool preprocess = true);
36
37 void write_stdout(const std::string& text, const std::string& end = "\n", bool flush = false);
38 void write_stderr(const std::string& text, const std::string& end = "\n", bool flush = false);
39
40 private:
41 void set_histfile();
42 std::string histfile;
43 std::string site_path;
44
45 std::string str(const pybind11::handle& obj);
46 std::string repr(const pybind11::handle& obj);
47 std::string sanitize(std::string s);
48
49 void process_ps1(const std::string& line);
50 void process_ps2(const std::string& line);
51 void set_completion_callback(const char* buffer, std::vector<std::string>& completions);
52
53 std::string get_ps1();
54 std::string get_ps2();
55
56 void handle_error();
57 void handle_error(pybind11::error_already_set& err);
58
59 // These mimic what we do in Server.cc
60 pybind11::module main_module;
61 pybind11::object main_namespace;
62 // FIXME: Do we need globals?
63 pybind11::dict globals;
64 pybind11::object sys;
65 pybind11::object py_stdout, py_stderr;
66 std::string collect;
67
68 const char* colour_error;
69 const char* colour_warning;
70 const char* colour_info;
71 const char* colour_success;
72 const char* colour_reset;
73 const char* colour_bold;
75};
76
77class ExitRequest : public std::exception {
78 public:
80 ExitRequest(int code);
81 ExitRequest(const std::string& message);
82
83 virtual const char* what() const noexcept override;
84
85 int code;
86 std::string message;
87};
88
89
Shell::Flags & operator|=(Shell::Flags &lhs, Shell::Flags rhs)
Definition cadabra2-cli.cc:527
bool operator&(Shell::Flags lhs, Shell::Flags rhs)
Definition cadabra2-cli.cc:540
Shell::Flags operator|(Shell::Flags lhs, Shell::Flags rhs)
Definition cadabra2-cli.cc:535
virtual const char * what() const noexcept override
Definition cadabra2-cli.cc:522
ExitRequest()
Definition cadabra2-cli.cc:513
std::string message
Definition cadabra2-cli.hh:86
int code
Definition cadabra2-cli.hh:85
std::string str(const pybind11::handle &obj)
Definition cadabra2-cli.cc:354
void interact()
Definition cadabra2-cli.cc:86
std::string site_path
Definition cadabra2-cli.hh:43
void process_ps2(const std::string &line)
Definition cadabra2-cli.cc:423
pybind11::module main_module
Definition cadabra2-cli.hh:60
std::string sanitize(std::string s)
Definition cadabra2-cli.cc:369
Flags flags
Definition cadabra2-cli.hh:74
void set_completion_callback(const char *buffer, std::vector< std::string > &completions)
Definition cadabra2-cli.cc:438
pybind11::object py_stderr
Definition cadabra2-cli.hh:65
pybind11::object evaluate(const std::string &code, const std::string &filename="<stdin>")
Definition cadabra2-cli.cc:164
const char * colour_bold
Definition cadabra2-cli.hh:73
std::string collect
Definition cadabra2-cli.hh:66
void start()
const char * colour_reset
Definition cadabra2-cli.hh:72
const char * colour_info
Definition cadabra2-cli.hh:70
pybind11::object sys
Definition cadabra2-cli.hh:64
void interact_file(const std::string &filename, bool preprocess=true)
Definition cadabra2-cli.cc:233
std::string get_ps2()
Definition cadabra2-cli.cc:466
std::string repr(const pybind11::handle &obj)
Definition cadabra2-cli.cc:359
void set_histfile()
Definition cadabra2-cli.cc:319
~Shell()
Definition cadabra2-cli.cc:80
pybind11::object main_namespace
Definition cadabra2-cli.hh:61
Flags
Definition cadabra2-cli.hh:19
@ NoReadline
Definition cadabra2-cli.hh:24
@ NoBanner
Definition cadabra2-cli.hh:21
@ None
Definition cadabra2-cli.hh:20
@ NoColour
Definition cadabra2-cli.hh:23
@ IgnoreSemicolons
Definition cadabra2-cli.hh:22
const char * colour_warning
Definition cadabra2-cli.hh:69
void handle_error()
Definition cadabra2-cli.cc:474
void write_stderr(const std::string &text, const std::string &end="\n", bool flush=false)
Definition cadabra2-cli.cc:307
std::string histfile
Definition cadabra2-cli.hh:42
void execute_file(const std::string &filename, bool preprocess=true)
Definition cadabra2-cli.cc:189
const char * colour_success
Definition cadabra2-cli.hh:71
pybind11::object py_stdout
Definition cadabra2-cli.hh:65
void execute(const std::string &code, const std::string &filename="<stdin>")
Definition cadabra2-cli.cc:177
const char * colour_error
Definition cadabra2-cli.hh:68
void write_stdout(const std::string &text, const std::string &end="\n", bool flush=false)
Definition cadabra2-cli.cc:295
pybind11::dict globals
Definition cadabra2-cli.hh:63
std::string get_ps1()
Definition cadabra2-cli.cc:458
void process_ps1(const std::string &line)
Definition cadabra2-cli.cc:375
void handle_error(pybind11::error_already_set &err)
Shell(Flags flags)
Definition cadabra2-cli.cc:46