#pragma once #include "completer.h" #include "formatted_output.h" #include "last_getopt_opts.h" #include "modchooser.h" #include #include namespace NLastGetopt { class TCompletionGenerator { public: explicit TCompletionGenerator(const TModChooser* modChooser); explicit TCompletionGenerator(const TOpts* opts); virtual ~TCompletionGenerator() = default; public: virtual void Generate(TStringBuf command, IOutputStream& stream) = 0; protected: std::variant Options_; }; class TZshCompletionGenerator: public TCompletionGenerator { public: using TCompletionGenerator::TCompletionGenerator; public: void Generate(TStringBuf command, IOutputStream& stream) override; private: static void GenerateModesCompletion(TFormattedOutput& out, const TModChooser& chooser, NComp::TCompleterManager& manager); static void GenerateOptsCompletion(TFormattedOutput& out, const TOpts& opts, NComp::TCompleterManager& manager); static void GenerateDefaultOptsCompletion(TFormattedOutput& out, NComp::TCompleterManager& manager); static void GenerateOptCompletion(TFormattedOutput& out, const TOpts& opts, const TOpt& opt, NComp::TCompleterManager& manager); }; class TBashCompletionGenerator: public TCompletionGenerator { public: using TCompletionGenerator::TCompletionGenerator; public: void Generate(TStringBuf command, IOutputStream& stream) override; private: static void GenerateModesCompletion(TFormattedOutput& out, const TModChooser& chooser, NComp::TCompleterManager& manager, size_t level); static void GenerateOptsCompletion(TFormattedOutput& out, const TOpts& opts, NComp::TCompleterManager& manager, size_t level); static void GenerateDefaultOptsCompletion(TFormattedOutput& out, NComp::TCompleterManager& manager); }; namespace NEscaping { /// Escape ':', '-', '=', '[', ']' for use in zsh _arguments TString Q(TStringBuf string); TString QQ(TStringBuf string); /// Escape colons for use in zsh _alternative and _arguments TString C(TStringBuf string); TString CC(TStringBuf string); /// Simple escape for use in zsh single-quoted strings TString S(TStringBuf string); TString SS(TStringBuf string); /// Simple escape for use in bash single-quoted strings TString B(TStringBuf string); TString BB(TStringBuf string); } }