[Add] Implemented Lua command execution engine.
Replacing hardcoded c++ 'ls' command with a generic system that finds and runs Lua scripts from the virual file system.
This commit is contained in:
parent
fbf70c43b3
commit
62d5f0526f
@ -21,6 +21,23 @@ std::string CommandProcessor::process_command(const std::string& command) {
|
||||
size_t end = cmd.find_last_not_of(" \t\n\r");
|
||||
cmd = (end == std::string::npos) ? "" : cmd.substr(0, end+1);
|
||||
|
||||
/* === Generic script executer. === */
|
||||
std::string command_name = cmd.substr(0, cmd.find(" "));
|
||||
|
||||
/* Search for script in the /bin directory. */
|
||||
std::string script_filename = command_name + ".lua";
|
||||
vfs_node* root = _current_dir;
|
||||
while(root->parent != nullptr) {
|
||||
root = root->parent;
|
||||
}
|
||||
if(root->children.count("bin") && root->children["bin"]->children.count(script_filename)) {
|
||||
vfs_node* script_node = root->children["bin"]->children[script_filename];
|
||||
/* TODO: Pass arguments to the Lua script. */
|
||||
return _lua->execute(script_node->content, _current_dir);
|
||||
}
|
||||
|
||||
|
||||
/* === Tmp fallback for built-in C++ commands. */
|
||||
if(command.rfind("cd ", 0) == 0) {
|
||||
std::string target_dir_name = command.substr(3);
|
||||
if(target_dir_name == "..") {
|
||||
@ -38,27 +55,6 @@ std::string CommandProcessor::process_command(const std::string& command) {
|
||||
return "cd: no such file or directory\n";
|
||||
}
|
||||
return get_full_path(_current_dir);
|
||||
} else if(cmd == "ls") {
|
||||
/* Find the root of the VFS to look for the /bin directory. */
|
||||
vfs_node* root = _current_dir;
|
||||
while(root->parent != nullptr) {
|
||||
root = root->parent;
|
||||
}
|
||||
|
||||
fprintf(stderr, "DEBUG: VFS root found, name: '%s'\n", root->name.c_str());
|
||||
|
||||
/* Find and execute the ls.lua script. */
|
||||
if(root->children.count("bin")) {
|
||||
fprintf(stderr, "DEBUG: Found '/bin' directory.\n");
|
||||
vfs_node* bin_dir = root->children["bin"];
|
||||
if(bin_dir->children.count("ls.lua")) {
|
||||
fprintf(stderr, "DEBUG: Found '/bin/ls.lua'. Executing.\n");
|
||||
vfs_node* ls_script_node = bin_dir->children["ls.lua"];
|
||||
return _lua->execute(ls_script_node->content, _current_dir);
|
||||
}
|
||||
}
|
||||
fprintf(stderr, "DEBUG: 'ls' command failed to find '/bin/ls.lua'.\n");
|
||||
return "ls: command not found\n";
|
||||
}
|
||||
|
||||
return "Unknown command: " + command + "\n";
|
||||
|
||||
Loading…
Reference in New Issue
Block a user