di 0.1.0
Loading...
Searching...
No Matches
zsh.h
Go to the documentation of this file.
1#pragma once
2
3#include "di/cli/value_type.h"
11#include "di/format/prelude.h"
13
14namespace di::cli::zsh {
15// Escape a description used in spec like:
16// --flag[description]
17// OR
18// ::command:((name\:"description"))
19constexpr auto escape_description(StringView input) -> String {
20 auto result = String {};
21 for (auto c : input) {
22 switch (c) {
23 case U'\\':
24 result += "\\\\"_sv;
25 break;
26 case U'\'':
27 result += "'\\''"_sv;
28 break;
29 case U'[':
30 result += "\\["_sv;
31 break;
32 case U']':
33 result += "\\]"_sv;
34 break;
35 case U':':
36 result += "\\:"_sv;
37 break;
38 case U'$':
39 result += "\\$"_sv;
40 break;
41 case U'`':
42 result += "\\`"_sv;
43 break;
44 case U'\n':
45 result += " "_sv;
46 break;
47 default:
48 result.push_back(c);
49 break;
50 }
51 }
52 return result;
53}
54
55// Escape a description used in spec like:
56// :: -- description:_default
57constexpr auto escape_arg_description(StringView input) -> String {
58 auto result = String {};
59 for (auto c : input) {
60 switch (c) {
61 case U'\'':
62 result += "'\\''"_sv;
63 break;
64 case U'[':
65 result += "\\["_sv;
66 break;
67 case U']':
68 result += "\\]"_sv;
69 break;
70 case U':':
71 result += "\\:"_sv;
72 break;
73 default:
74 result.push_back(c);
75 break;
76 }
77 }
78 return result;
79}
80
81// Escape a key used in an spec like:
82// ::command:((key\:"value"))
83constexpr auto escape_key(StringView input) -> String {
84 auto result = String {};
85 for (auto c : input) {
86 switch (c) {
87 case U'\\':
88 result += "\\\\"_sv;
89 break;
90 case U'\'':
91 result += "'\\''"_sv;
92 break;
93 case U'[':
94 result += "\\["_sv;
95 break;
96 case U']':
97 result += "\\]"_sv;
98 break;
99 case U':':
100 result += "\\:"_sv;
101 break;
102 case U'$':
103 result += "\\$"_sv;
104 break;
105 case U'`':
106 result += "\\`"_sv;
107 break;
108 case U'(':
109 result += "\\("_sv;
110 break;
111 case U')':
112 result += "\\)"_sv;
113 break;
114 case U' ':
115 result += "\\ "_sv;
116 break;
117 default:
118 result.push_back(c);
119 break;
120 }
121 }
122 return result;
123}
124
126 if (all_of(input, empty, [](auto const& item) {
127 return di::get<1>(item);
128 })) {
129 auto inner = keys(input) | join_with(U' ') | di::to<String>();
130 return format("({})"_sv, inner);
131 }
132 auto inner = input | transform([](auto const& item) {
133 auto const& [key, description] = item;
134 return format("{}\\:\"{}\""_sv, escape_key(key), escape_description(description));
135 }) |
136 join_with(U' ') | di::to<String>();
137 return format("(({}))"_sv, inner);
138}
139
140constexpr auto value_completions(ValueType value_type, Span<Tuple<String, StringView>> values) -> String {
141 using enum ValueType;
142 switch (value_type) {
143 case Unknown:
144 return {};
145 case Path:
146 return "_files"_s;
147 case Directory:
148 return "_files -/"_s;
149 case Executable:
150 return "_absolute_command_paths"_s;
151 case CommandName:
152 return "_command_names -e"_s;
153 case CommandWithArgs:
154 return "_cmdambivalent"_s;
155 case Enum: {
156 if (!values.empty()) {
157 return zsh::completion_value_map(values.span());
158 }
159 return {};
160 }
161 }
162 return {};
163}
164}
Definition span_forward_declaration.h:10
Definition tuple.h:27
Definition zsh.h:14
constexpr auto escape_description(StringView input) -> String
Definition zsh.h:19
constexpr auto completion_value_map(Span< Tuple< String, StringView > > input) -> String
Definition zsh.h:125
constexpr auto value_completions(ValueType value_type, Span< Tuple< String, StringView > > values) -> String
Definition zsh.h:140
constexpr auto escape_key(StringView input) -> String
Definition zsh.h:83
constexpr auto escape_arg_description(StringView input) -> String
Definition zsh.h:57
ValueType
Definition value_type.h:11
@ CommandName
Definition value_type.h:17
@ CommandWithArgs
Definition value_type.h:18
@ Executable
Definition value_type.h:16
@ Unknown
Definition value_type.h:12
@ Enum
Definition value_type.h:13
@ Directory
Definition value_type.h:15
string::StringViewImpl< string::Utf8Encoding > StringView
Definition string_view.h:12
string::StringImpl< string::Utf8Encoding > String
Definition string.h:11
PathImpl< TransparentString > Path
Definition path.h:10
constexpr auto get(T &&value) -> decltype(auto)
Definition get.h:8
constexpr auto empty
Definition empty.h:45
constexpr auto format
Definition format.h:7
constexpr auto to(Con &&container, Args &&... args)
Definition to.h:25
constexpr auto all_of
Definition all_of.h:24