freelang-v4 4.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (261) hide show
  1. package/README.md +548 -0
  2. package/dist/ast.d.ts +367 -0
  3. package/dist/ast.js +4 -0
  4. package/dist/ast.js.map +1 -0
  5. package/dist/async-basic.test.d.ts +1 -0
  6. package/dist/async-basic.test.js +88 -0
  7. package/dist/async-basic.test.js.map +1 -0
  8. package/dist/async-jest.test.d.ts +1 -0
  9. package/dist/async-jest.test.js +99 -0
  10. package/dist/async-jest.test.js.map +1 -0
  11. package/dist/channel-jest.test.d.ts +1 -0
  12. package/dist/channel-jest.test.js +148 -0
  13. package/dist/channel-jest.test.js.map +1 -0
  14. package/dist/checker-jest.test.d.ts +1 -0
  15. package/dist/checker-jest.test.js +160 -0
  16. package/dist/checker-jest.test.js.map +1 -0
  17. package/dist/checker.d.ts +149 -0
  18. package/dist/checker.js +1565 -0
  19. package/dist/checker.js.map +1 -0
  20. package/dist/checker.test.d.ts +1 -0
  21. package/dist/checker.test.js +217 -0
  22. package/dist/checker.test.js.map +1 -0
  23. package/dist/compiler-jest.test.d.ts +1 -0
  24. package/dist/compiler-jest.test.js +233 -0
  25. package/dist/compiler-jest.test.js.map +1 -0
  26. package/dist/compiler.d.ts +127 -0
  27. package/dist/compiler.js +1588 -0
  28. package/dist/compiler.js.map +1 -0
  29. package/dist/compiler.test.d.ts +1 -0
  30. package/dist/compiler.test.js +313 -0
  31. package/dist/compiler.test.js.map +1 -0
  32. package/dist/db-100m-full.d.ts +5 -0
  33. package/dist/db-100m-full.js +78 -0
  34. package/dist/db-100m-full.js.map +1 -0
  35. package/dist/db-100m-no-index.d.ts +12 -0
  36. package/dist/db-100m-no-index.js +119 -0
  37. package/dist/db-100m-no-index.js.map +1 -0
  38. package/dist/db-100m-real.d.ts +5 -0
  39. package/dist/db-100m-real.js +131 -0
  40. package/dist/db-100m-real.js.map +1 -0
  41. package/dist/db-100m-streaming.d.ts +15 -0
  42. package/dist/db-100m-streaming.js +164 -0
  43. package/dist/db-100m-streaming.js.map +1 -0
  44. package/dist/db-100m-test.d.ts +5 -0
  45. package/dist/db-100m-test.js +111 -0
  46. package/dist/db-100m-test.js.map +1 -0
  47. package/dist/db-jest.test.d.ts +1 -0
  48. package/dist/db-jest.test.js +182 -0
  49. package/dist/db-jest.test.js.map +1 -0
  50. package/dist/db-runtime.d.ts +24 -0
  51. package/dist/db-runtime.js +204 -0
  52. package/dist/db-runtime.js.map +1 -0
  53. package/dist/db.d.ts +249 -0
  54. package/dist/db.js +593 -0
  55. package/dist/db.js.map +1 -0
  56. package/dist/file-io-jest.test.d.ts +1 -0
  57. package/dist/file-io-jest.test.js +225 -0
  58. package/dist/file-io-jest.test.js.map +1 -0
  59. package/dist/for-of-jest.test.d.ts +1 -0
  60. package/dist/for-of-jest.test.js +230 -0
  61. package/dist/for-of-jest.test.js.map +1 -0
  62. package/dist/for-of.test.d.ts +1 -0
  63. package/dist/for-of.test.js +305 -0
  64. package/dist/for-of.test.js.map +1 -0
  65. package/dist/function-literal-jest.test.d.ts +1 -0
  66. package/dist/function-literal-jest.test.js +180 -0
  67. package/dist/function-literal-jest.test.js.map +1 -0
  68. package/dist/function-literal.test.d.ts +1 -0
  69. package/dist/function-literal.test.js +245 -0
  70. package/dist/function-literal.test.js.map +1 -0
  71. package/dist/generics-jest.test.d.ts +1 -0
  72. package/dist/generics-jest.test.js +93 -0
  73. package/dist/generics-jest.test.js.map +1 -0
  74. package/dist/ir-gen.d.ts +15 -0
  75. package/dist/ir-gen.js +400 -0
  76. package/dist/ir-gen.js.map +1 -0
  77. package/dist/ir.d.ts +114 -0
  78. package/dist/ir.js +5 -0
  79. package/dist/ir.js.map +1 -0
  80. package/dist/lexer.d.ts +110 -0
  81. package/dist/lexer.js +467 -0
  82. package/dist/lexer.js.map +1 -0
  83. package/dist/lexer.test.d.ts +1 -0
  84. package/dist/lexer.test.js +426 -0
  85. package/dist/lexer.test.js.map +1 -0
  86. package/dist/main.d.ts +2 -0
  87. package/dist/main.js +241 -0
  88. package/dist/main.js.map +1 -0
  89. package/dist/module-jest.test.d.ts +1 -0
  90. package/dist/module-jest.test.js +123 -0
  91. package/dist/module-jest.test.js.map +1 -0
  92. package/dist/parser.d.ts +56 -0
  93. package/dist/parser.js +1060 -0
  94. package/dist/parser.js.map +1 -0
  95. package/dist/parser.test.d.ts +1 -0
  96. package/dist/parser.test.js +461 -0
  97. package/dist/parser.test.js.map +1 -0
  98. package/dist/pattern-matching-jest.test.d.ts +1 -0
  99. package/dist/pattern-matching-jest.test.js +158 -0
  100. package/dist/pattern-matching-jest.test.js.map +1 -0
  101. package/dist/pkg/init.d.ts +1 -0
  102. package/dist/pkg/init.js +118 -0
  103. package/dist/pkg/init.js.map +1 -0
  104. package/dist/pkg/install.d.ts +1 -0
  105. package/dist/pkg/install.js +77 -0
  106. package/dist/pkg/install.js.map +1 -0
  107. package/dist/pkg/registry.d.ts +23 -0
  108. package/dist/pkg/registry.js +106 -0
  109. package/dist/pkg/registry.js.map +1 -0
  110. package/dist/pkg/run.d.ts +1 -0
  111. package/dist/pkg/run.js +76 -0
  112. package/dist/pkg/run.js.map +1 -0
  113. package/dist/pkg/toml.d.ts +5 -0
  114. package/dist/pkg/toml.js +117 -0
  115. package/dist/pkg/toml.js.map +1 -0
  116. package/dist/repl.d.ts +15 -0
  117. package/dist/repl.js +197 -0
  118. package/dist/repl.js.map +1 -0
  119. package/dist/runtime/bytecode.d.ts +92 -0
  120. package/dist/runtime/bytecode.js +253 -0
  121. package/dist/runtime/bytecode.js.map +1 -0
  122. package/dist/runtime/value.d.ts +102 -0
  123. package/dist/runtime/value.js +302 -0
  124. package/dist/runtime/value.js.map +1 -0
  125. package/dist/runtime/vm.d.ts +65 -0
  126. package/dist/runtime/vm.js +293 -0
  127. package/dist/runtime/vm.js.map +1 -0
  128. package/dist/struct-instance-jest.test.d.ts +1 -0
  129. package/dist/struct-instance-jest.test.js +209 -0
  130. package/dist/struct-instance-jest.test.js.map +1 -0
  131. package/dist/struct-instance.test.d.ts +1 -0
  132. package/dist/struct-instance.test.js +291 -0
  133. package/dist/struct-instance.test.js.map +1 -0
  134. package/dist/struct-jest.test.d.ts +1 -0
  135. package/dist/struct-jest.test.js +176 -0
  136. package/dist/struct-jest.test.js.map +1 -0
  137. package/dist/struct.test.d.ts +1 -0
  138. package/dist/struct.test.js +231 -0
  139. package/dist/struct.test.js.map +1 -0
  140. package/dist/trait-jest.test.d.ts +1 -0
  141. package/dist/trait-jest.test.js +120 -0
  142. package/dist/trait-jest.test.js.map +1 -0
  143. package/dist/vm-jest.test.d.ts +1 -0
  144. package/dist/vm-jest.test.js +569 -0
  145. package/dist/vm-jest.test.js.map +1 -0
  146. package/dist/vm.d.ts +81 -0
  147. package/dist/vm.js +1956 -0
  148. package/dist/vm.js.map +1 -0
  149. package/dist/vm.test.d.ts +1 -0
  150. package/dist/vm.test.js +337 -0
  151. package/dist/vm.test.js.map +1 -0
  152. package/dist/web-repl/sandbox.d.ts +11 -0
  153. package/dist/web-repl/sandbox.js +76 -0
  154. package/dist/web-repl/sandbox.js.map +1 -0
  155. package/dist/web-repl/server.d.ts +1 -0
  156. package/dist/web-repl/server.js +111 -0
  157. package/dist/web-repl/server.js.map +1 -0
  158. package/dist/while-loop-jest.test.d.ts +1 -0
  159. package/dist/while-loop-jest.test.js +201 -0
  160. package/dist/while-loop-jest.test.js.map +1 -0
  161. package/dist/while-loop.test.d.ts +1 -0
  162. package/dist/while-loop.test.js +262 -0
  163. package/dist/while-loop.test.js.map +1 -0
  164. package/docs/EXPERIENCE.md +787 -0
  165. package/docs/README.md +175 -0
  166. package/docs/V1_V2_V3_ANALYSIS.md +107 -0
  167. package/docs/_config.yml +36 -0
  168. package/docs/api-reference.md +459 -0
  169. package/docs/architecture.md +470 -0
  170. package/docs/benchmarks.md +295 -0
  171. package/docs/comparison.md +454 -0
  172. package/docs/index.md +335 -0
  173. package/docs/language-completeness.md +228 -0
  174. package/docs/learning-guide.md +651 -0
  175. package/package.json +65 -0
  176. package/src/api/deploy_key.fl +294 -0
  177. package/src/api/issue.fl +302 -0
  178. package/src/api/org.fl +356 -0
  179. package/src/api/repo.fl +394 -0
  180. package/src/api/team.fl +299 -0
  181. package/src/api/user.fl +385 -0
  182. package/src/api/webhook.fl +273 -0
  183. package/src/ast.ts +158 -0
  184. package/src/async-basic.test.ts +94 -0
  185. package/src/async-jest.test.ts +107 -0
  186. package/src/channel-jest.test.ts +158 -0
  187. package/src/checker-jest.test.ts +189 -0
  188. package/src/checker.test.ts +279 -0
  189. package/src/checker.ts +1861 -0
  190. package/src/commands/analyze.fl +227 -0
  191. package/src/commands/auth.fl +315 -0
  192. package/src/commands/batch.fl +349 -0
  193. package/src/commands/config.fl +199 -0
  194. package/src/commands/deploy_key.fl +352 -0
  195. package/src/commands/issue.fl +275 -0
  196. package/src/commands/main.fl +492 -0
  197. package/src/commands/org.fl +425 -0
  198. package/src/commands/repo.fl +581 -0
  199. package/src/commands/team.fl +244 -0
  200. package/src/commands/user.fl +423 -0
  201. package/src/commands/webhook.fl +400 -0
  202. package/src/compiler-jest.test.ts +275 -0
  203. package/src/compiler.test.ts +375 -0
  204. package/src/compiler.ts +1770 -0
  205. package/src/config.fl +175 -0
  206. package/src/core/batch.fl +355 -0
  207. package/src/core/cache.fl +284 -0
  208. package/src/core/ensure.fl +324 -0
  209. package/src/db-100m-full.ts +96 -0
  210. package/src/db-100m-no-index.ts +133 -0
  211. package/src/db-100m-real.ts +152 -0
  212. package/src/db-100m-streaming.ts +154 -0
  213. package/src/db-100m-test.ts +136 -0
  214. package/src/db-jest.test.ts +161 -0
  215. package/src/db-runtime.ts +242 -0
  216. package/src/db.ts +676 -0
  217. package/src/errors.fl +134 -0
  218. package/src/for-of-jest.test.ts +246 -0
  219. package/src/for-of.test.ts +308 -0
  220. package/src/function-literal-jest.test.ts +193 -0
  221. package/src/function-literal.test.ts +248 -0
  222. package/src/generics-jest.test.ts +104 -0
  223. package/src/http/client.fl +327 -0
  224. package/src/ir-gen.ts +459 -0
  225. package/src/ir.ts +80 -0
  226. package/src/lexer.test.ts +499 -0
  227. package/src/lexer.ts +522 -0
  228. package/src/main.ts +223 -0
  229. package/src/models.fl +162 -0
  230. package/src/module-jest.test.ts +145 -0
  231. package/src/parser.test.ts +542 -0
  232. package/src/parser.ts +1211 -0
  233. package/src/pattern-matching-jest.test.ts +170 -0
  234. package/src/pkg/init.ts +91 -0
  235. package/src/pkg/install.ts +56 -0
  236. package/src/pkg/registry.ts +103 -0
  237. package/src/pkg/run.ts +49 -0
  238. package/src/pkg/toml.ts +129 -0
  239. package/src/repl.ts +190 -0
  240. package/src/runtime/bytecode.ts +291 -0
  241. package/src/runtime/value.ts +322 -0
  242. package/src/runtime/vm.ts +354 -0
  243. package/src/self-host/bootstrap.fl +68 -0
  244. package/src/self-host/interpreter.fl +361 -0
  245. package/src/self-host/lexer-simple.fl +22 -0
  246. package/src/self-host/lexer.fl +305 -0
  247. package/src/self-host/parser.fl +580 -0
  248. package/src/struct-instance-jest.test.ts +221 -0
  249. package/src/struct-instance.test.ts +293 -0
  250. package/src/struct-jest.test.ts +187 -0
  251. package/src/struct.test.ts +234 -0
  252. package/src/trait-jest.test.ts +136 -0
  253. package/src/vm-jest.test.ts +754 -0
  254. package/src/vm.ts +1976 -0
  255. package/src/web-repl/public/index.html +50 -0
  256. package/src/web-repl/public/main.js +105 -0
  257. package/src/web-repl/public/style.css +225 -0
  258. package/src/web-repl/sandbox.ts +88 -0
  259. package/src/web-repl/server.ts +97 -0
  260. package/src/while-loop-jest.test.ts +218 -0
  261. package/src/while-loop.test.ts +267 -0
@@ -0,0 +1,425 @@
1
+ // FreeLang v4.2 — gogs-cli Phase 5 조직 명령어
2
+ // create, list, view, member add/remove 구현
3
+ // 250라인
4
+
5
+ /// 조직 생성
6
+ /// gogs org create ORG_NAME [--full-name "name"] [--email email@com]
7
+ async fn cmd_org_create(args: CliArgs) -> CliResult {
8
+ // 1. 인자 검증
9
+ var org_name = get_positional(args, 0)
10
+ if org_name == "" {
11
+ return CliResult {
12
+ exit_code: 1,
13
+ output: "",
14
+ error: "Organization name is required"
15
+ }
16
+ }
17
+
18
+ // 2. 플래그 파싱
19
+ var full_name = get_flag(args, "full-name")
20
+ var email = get_flag(args, "email")
21
+ var website = get_flag(args, "website")
22
+ var location = get_flag(args, "location")
23
+
24
+ if full_name == "" {
25
+ full_name = org_name
26
+ }
27
+
28
+ // 3. 설정 로드
29
+ var host = await get_default_host()
30
+ if host.url == "" {
31
+ return CliResult {
32
+ exit_code: 1,
33
+ output: "",
34
+ error: "Not logged in"
35
+ }
36
+ }
37
+
38
+ // 4. 클라이언트 및 캐시
39
+ var client = new_client(host.url, host.token)
40
+ var cache = new_cache(300)
41
+
42
+ // 5. API 호출
43
+ println("Creating organization '" + org_name + "'...")
44
+
45
+ var org_service = new_org_service(client, cache)
46
+ var req = CreateOrgRequest {
47
+ username: org_name,
48
+ full_name: full_name,
49
+ email: email,
50
+ website: website,
51
+ location: location,
52
+ bio: ""
53
+ }
54
+ var result = await create_org(org_service, req)
55
+
56
+ // 6. 결과 처리
57
+ match result {
58
+ Result::Ok(org) => {
59
+ var output = ""
60
+ output = output + "✓ Organization created\n"
61
+ output = output + " Name: " + org.username + "\n"
62
+ output = output + " Full Name: " + org.full_name + "\n"
63
+ if org.email != "" {
64
+ output = output + " Email: " + org.email + "\n"
65
+ }
66
+
67
+ CliResult {
68
+ exit_code: 0,
69
+ output: output,
70
+ error: ""
71
+ }
72
+ }
73
+ Result::Err(err) => {
74
+ CliResult {
75
+ exit_code: 1,
76
+ output: "",
77
+ error: error_message(err)
78
+ }
79
+ }
80
+ }
81
+ }
82
+
83
+ /// 조직 목록
84
+ /// gogs org list [--json] [--yaml]
85
+ async fn cmd_org_list(args: CliArgs) -> CliResult {
86
+ // 1. 설정 로드
87
+ var host = await get_default_host()
88
+ if host.url == "" {
89
+ return CliResult {
90
+ exit_code: 1,
91
+ output: "",
92
+ error: "Not logged in"
93
+ }
94
+ }
95
+
96
+ // 2. 클라이언트 및 캐시
97
+ var client = new_client(host.url, host.token)
98
+ var cache = new_cache(300)
99
+
100
+ // 3. API 호출
101
+ println("Fetching organizations...")
102
+
103
+ var org_service = new_org_service(client, cache)
104
+ var result = await list_orgs(org_service)
105
+
106
+ // 4. 결과 처리
107
+ match result {
108
+ Result::Ok(orgs) => {
109
+ var format = get_format(args)
110
+
111
+ if format == "json" {
112
+ return org_list_json(orgs)
113
+ }
114
+ if format == "yaml" {
115
+ return org_list_yaml(orgs)
116
+ }
117
+
118
+ org_list_text(orgs)
119
+ }
120
+ Result::Err(err) => {
121
+ CliResult {
122
+ exit_code: 1,
123
+ output: "",
124
+ error: error_message(err)
125
+ }
126
+ }
127
+ }
128
+ }
129
+
130
+ /// 조직 상세
131
+ /// gogs org view ORG_NAME [--json] [--yaml]
132
+ async fn cmd_org_view(args: CliArgs) -> CliResult {
133
+ // 1. 인자 검증
134
+ var org_name = get_positional(args, 0)
135
+ if org_name == "" {
136
+ return CliResult {
137
+ exit_code: 1,
138
+ output: "",
139
+ error: "Organization name is required"
140
+ }
141
+ }
142
+
143
+ // 2. 설정 로드
144
+ var host = await get_default_host()
145
+ if host.url == "" {
146
+ return CliResult {
147
+ exit_code: 1,
148
+ output: "",
149
+ error: "Not logged in"
150
+ }
151
+ }
152
+
153
+ // 3. 클라이언트 및 캐시
154
+ var client = new_client(host.url, host.token)
155
+ var cache = new_cache(300)
156
+
157
+ // 4. API 호출
158
+ println("Fetching organization '" + org_name + "'...")
159
+
160
+ var org_service = new_org_service(client, cache)
161
+ var result = await get_org(org_service, org_name)
162
+
163
+ // 5. 결과 처리
164
+ match result {
165
+ Result::Ok(org) => {
166
+ var format = get_format(args)
167
+
168
+ if format == "json" {
169
+ return org_view_json(org)
170
+ }
171
+ if format == "yaml" {
172
+ return org_view_yaml(org)
173
+ }
174
+
175
+ org_view_text(org)
176
+ }
177
+ Result::Err(err) => {
178
+ CliResult {
179
+ exit_code: 1,
180
+ output: "",
181
+ error: error_message(err)
182
+ }
183
+ }
184
+ }
185
+ }
186
+
187
+ /// 멤버 추가
188
+ /// gogs member add ORG_NAME USERNAME
189
+ async fn cmd_member_add(args: CliArgs) -> CliResult {
190
+ // 1. 인자 검증
191
+ var org_name = get_positional(args, 0)
192
+ var username = get_positional(args, 1)
193
+
194
+ if org_name == "" {
195
+ return CliResult {
196
+ exit_code: 1,
197
+ output: "",
198
+ error: "Organization name is required"
199
+ }
200
+ }
201
+
202
+ if username == "" {
203
+ return CliResult {
204
+ exit_code: 1,
205
+ output: "",
206
+ error: "Username is required"
207
+ }
208
+ }
209
+
210
+ // 2. 설정 로드
211
+ var host = await get_default_host()
212
+ if host.url == "" {
213
+ return CliResult {
214
+ exit_code: 1,
215
+ output: "",
216
+ error: "Not logged in"
217
+ }
218
+ }
219
+
220
+ // 3. 클라이언트 및 캐시
221
+ var client = new_client(host.url, host.token)
222
+ var cache = new_cache(300)
223
+
224
+ // 4. API 호출
225
+ println("Adding " + username + " to " + org_name + "...")
226
+
227
+ var org_service = new_org_service(client, cache)
228
+ var result = await add_org_member(org_service, org_name, username)
229
+
230
+ // 5. 결과 처리
231
+ match result {
232
+ Result::Ok(_) => {
233
+ CliResult {
234
+ exit_code: 0,
235
+ output: "✓ Member added: " + username + " to " + org_name,
236
+ error: ""
237
+ }
238
+ }
239
+ Result::Err(err) => {
240
+ CliResult {
241
+ exit_code: 1,
242
+ output: "",
243
+ error: error_message(err)
244
+ }
245
+ }
246
+ }
247
+ }
248
+
249
+ /// 멤버 제거
250
+ /// gogs member remove ORG_NAME USERNAME
251
+ async fn cmd_member_remove(args: CliArgs) -> CliResult {
252
+ // 1. 인자 검증
253
+ var org_name = get_positional(args, 0)
254
+ var username = get_positional(args, 1)
255
+
256
+ if org_name == "" {
257
+ return CliResult {
258
+ exit_code: 1,
259
+ output: "",
260
+ error: "Organization name is required"
261
+ }
262
+ }
263
+
264
+ if username == "" {
265
+ return CliResult {
266
+ exit_code: 1,
267
+ output: "",
268
+ error: "Username is required"
269
+ }
270
+ }
271
+
272
+ // 2. 플래그 확인
273
+ var force = has_flag(args, "force")
274
+
275
+ if !force {
276
+ println("⚠️ This will remove " + username + " from " + org_name)
277
+ println("Run with --force to confirm")
278
+ return CliResult {
279
+ exit_code: 1,
280
+ output: "",
281
+ error: "Removal not confirmed"
282
+ }
283
+ }
284
+
285
+ // 3. 설정 로드
286
+ var host = await get_default_host()
287
+ if host.url == "" {
288
+ return CliResult {
289
+ exit_code: 1,
290
+ output: "",
291
+ error: "Not logged in"
292
+ }
293
+ }
294
+
295
+ // 4. 클라이언트 및 캐시
296
+ var client = new_client(host.url, host.token)
297
+ var cache = new_cache(300)
298
+
299
+ // 5. API 호출
300
+ println("Removing " + username + " from " + org_name + "...")
301
+
302
+ var org_service = new_org_service(client, cache)
303
+ var result = await remove_org_member(org_service, org_name, username)
304
+
305
+ // 6. 결과 처리
306
+ match result {
307
+ Result::Ok(_) => {
308
+ CliResult {
309
+ exit_code: 0,
310
+ output: "✓ Member removed: " + username + " from " + org_name,
311
+ error: ""
312
+ }
313
+ }
314
+ Result::Err(err) => {
315
+ CliResult {
316
+ exit_code: 1,
317
+ output: "",
318
+ error: error_message(err)
319
+ }
320
+ }
321
+ }
322
+ }
323
+
324
+ // ==================== 출력 포맷: 목록 ====================
325
+
326
+ fn org_list_text(orgs: [Organization]) -> CliResult {
327
+ var output = ""
328
+ output = output + "╔════════════════════════════════════════════════════════════════════╗\n"
329
+ output = output + "║ Organization List ║\n"
330
+ output = output + "╚════════════════════════════════════════════════════════════════════╝\n"
331
+ output = output + "\n"
332
+
333
+ if length(orgs) == 0 {
334
+ output = output + "No organizations found\n"
335
+ return CliResult {
336
+ exit_code: 0,
337
+ output: output,
338
+ error: ""
339
+ }
340
+ }
341
+
342
+ var i: i32 = 0
343
+ while i < length(orgs) {
344
+ var org = orgs[i]
345
+ output = output + "📁 " + org.username + "\n"
346
+ output = output + " " + org.full_name + "\n"
347
+ if org.email != "" {
348
+ output = output + " Email: " + org.email + "\n"
349
+ }
350
+ output = output + "\n"
351
+ i = i + 1
352
+ }
353
+
354
+ output = output + "Total: " + str(length(orgs)) + " organizations\n"
355
+
356
+ CliResult {
357
+ exit_code: 0,
358
+ output: output,
359
+ error: ""
360
+ }
361
+ }
362
+
363
+ fn org_list_json(orgs: [Organization]) -> CliResult {
364
+ var json = "[\n"
365
+ var i: i32 = 0
366
+ while i < length(orgs) {
367
+ var org = orgs[i]
368
+ json = json + " {\"name\": \"" + org.username + "\", \"full_name\": \"" + org.full_name + "\"}"
369
+ if i < length(orgs) - 1 { json = json + "," }
370
+ json = json + "\n"
371
+ i = i + 1
372
+ }
373
+ json = json + "]\n"
374
+ CliResult { exit_code: 0, output: json, error: "" }
375
+ }
376
+
377
+ fn org_list_yaml(orgs: [Organization]) -> CliResult {
378
+ var yaml = "organizations:\n"
379
+ var i: i32 = 0
380
+ while i < length(orgs) {
381
+ var org = orgs[i]
382
+ yaml = yaml + " - name: " + org.username + "\n"
383
+ yaml = yaml + " full_name: " + org.full_name + "\n"
384
+ i = i + 1
385
+ }
386
+ CliResult { exit_code: 0, output: yaml, error: "" }
387
+ }
388
+
389
+ // ==================== 출력 포맷: 상세 ====================
390
+
391
+ fn org_view_text(org: Organization) -> CliResult {
392
+ var output = ""
393
+ output = output + "╔════════════════════════════════════════════════════════════════════╗\n"
394
+ output = output + "║ Organization Details ║\n"
395
+ output = output + "╚════════════════════════════════════════════════════════════════════╝\n"
396
+ output = output + "\n"
397
+ output = output + "Name: " + org.username + "\n"
398
+ output = output + "Full Name: " + org.full_name + "\n"
399
+ output = output + "Email: " + org.email + "\n"
400
+ output = output + "Website: " + org.website + "\n"
401
+ output = output + "Location: " + org.location + "\n"
402
+ output = output + "\n"
403
+
404
+ CliResult {
405
+ exit_code: 0,
406
+ output: output,
407
+ error: ""
408
+ }
409
+ }
410
+
411
+ fn org_view_json(org: Organization) -> CliResult {
412
+ var json = "{\"name\": \"" + org.username + "\", \"full_name\": \"" + org.full_name + "\", \"email\": \"" + org.email + "\"}\n"
413
+ CliResult { exit_code: 0, output: json, error: "" }
414
+ }
415
+
416
+ fn org_view_yaml(org: Organization) -> CliResult {
417
+ var yaml = "name: " + org.username + "\nfull_name: " + org.full_name + "\nemail: " + org.email + "\n"
418
+ CliResult { exit_code: 0, output: yaml, error: "" }
419
+ }
420
+
421
+ // 필요한 함수들:
422
+ // - get_positional, has_flag, get_flag, get_format
423
+ // - get_default_host, new_client, new_cache
424
+ // - new_org_service, create_org, list_orgs, get_org, add_org_member, remove_org_member
425
+ // - error_message