Changes
2 changed files (+86/-49)
-
-
@@ -18,6 +18,7 @@ const std = @import("std");const clap = @import("clap"); const core = @import("core"); const connection = @import("../connection.zig"); const State = @import("../State.zig"); const ExitCode = @import("../exit.zig").ExitCode;
-
@@ -54,56 +55,12 @@ std.log.err("--zone is required", .{});return ExitCode.incorrect_usage; }; const server_id, const saved_token = state: { const state = State.read(allocator) catch |err| { std.log.err("Failed to read state file: {s}", .{@errorName(err)}); return ExitCode.not_ok; const conn = connection.make(allocator) catch |err| { std.log.err("Unable to establish a connection: {s}", .{@errorName(err)}); return switch (err) { error.OutOfMemory => ExitCode.out_of_memory, else => ExitCode.not_ok, }; defer state.deinit(); const conn = state.value.connection orelse { std.log.err("No previous connection: connect to server first", .{}); return ExitCode.not_ok; }; const server_id = allocator.dupeZ(u8, conn.server_id) catch { std.log.err("Failed to restore server ID from state file: Out of memory", .{}); return ExitCode.out_of_memory; }; const saved_token = allocator.dupeZ(u8, conn.token) catch { std.log.err("Failed to restore token from state file: Out of memory", .{}); allocator.free(server_id); return ExitCode.out_of_memory; }; break :state .{ server_id, saved_token }; }; defer allocator.free(server_id); defer allocator.free(saved_token); const find_result = core.discovery.find(server_id.ptr) orelse { std.log.err("Unable to get server info: Out of memory", .{}); return ExitCode.out_of_memory; }; defer find_result.release(); if (find_result.code != .ok) { std.log.err("Failed to get server info: {s}", .{@tagName(find_result.code)}); return ExitCode.not_ok; } if (find_result.servers_len == 0) { std.log.err("Server not found for ID={s}", .{server_id}); return ExitCode.not_ok; } const server = find_result.servers_ptr[0]; const conn = core.connection.Connection.make(server, saved_token.ptr) orelse { std.log.err("Unable to connect: Out of memory", .{}); return ExitCode.out_of_memory; }; defer conn.release();
-
-
cli/src/connection.zig (new)
-
@@ -0,0 +1,80 @@// Copyright 2025 Shota FUJI // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // // SPDX-License-Identifier: Apache-2.0 const std = @import("std"); const core = @import("core"); const State = @import("./State.zig"); pub const MakeError = error{ NoSavedConnection, FailedToFindServer, ServerNotFound, }; pub fn make(allocator: std.mem.Allocator) !*core.connection.Connection { const server_id, const saved_token = state: { const state = State.read(allocator) catch |err| { std.log.err("Failed to read state file: {s}", .{@errorName(err)}); return err; }; defer state.deinit(); const conn = state.value.connection orelse { std.log.err("No previous connection: connect to server first", .{}); return MakeError.NoSavedConnection; }; const server_id = allocator.dupeZ(u8, conn.server_id) catch { std.log.err("Failed to restore server ID from state file: Out of memory", .{}); return std.mem.Allocator.Error.OutOfMemory; }; errdefer allocator.free(server_id); const saved_token = allocator.dupeZ(u8, conn.token) catch { std.log.err("Failed to restore token from state file: Out of memory", .{}); return std.mem.Allocator.Error.OutOfMemory; }; break :state .{ server_id, saved_token }; }; defer allocator.free(server_id); defer allocator.free(saved_token); const find_result = core.discovery.find(server_id.ptr) orelse { std.log.err("Unable to get server info: Out of memory", .{}); return std.mem.Allocator.Error.OutOfMemory; }; defer find_result.release(); if (find_result.code != .ok) { std.log.err("Failed to get server info: {s}", .{@tagName(find_result.code)}); return MakeError.FailedToFindServer; } if (find_result.servers_len == 0) { std.log.err("Server not found for ID={s}", .{server_id}); return MakeError.ServerNotFound; } const server = find_result.servers_ptr[0]; return core.connection.Connection.make(server, saved_token.ptr) orelse { std.log.err("Unable to connect: Out of memory", .{}); return std.mem.Allocator.Error.OutOfMemory; }; }
-