From 766d11495d1851676104a2f4c132042ddf30e7c0 Mon Sep 17 00:00:00 2001 From: so Date: Tue, 2 Jun 2026 20:16:06 +0800 Subject: [PATCH] fix(fs): handle folder info array response Co-authored-by: OpenAI Codex --- error.go | 7 ++++++- fs.go | 27 +++++++++++++++++++++++++++ fs_test.go | 37 +++++++++++++++++++++++++++++++++++++ 3 files changed, 70 insertions(+), 1 deletion(-) create mode 100644 fs_test.go diff --git a/error.go b/error.go index ae740d6..a2fdc15 100644 --- a/error.go +++ b/error.go @@ -1,6 +1,11 @@ package sdk -import "fmt" +import ( + "errors" + "fmt" +) + +var ErrObjectNotFound = errors.New("object not found") type Error struct { Code int64 `json:"code"` diff --git a/fs.go b/fs.go index 8ea762a..b6a577c 100644 --- a/fs.go +++ b/fs.go @@ -2,6 +2,7 @@ package sdk import ( + "bytes" "context" "encoding/json" "net/http" @@ -157,6 +158,32 @@ type GetFolderInfoResp struct { } `json:"paths"` } +func (r *GetFolderInfoResp) UnmarshalJSON(data []byte) error { + data = bytes.TrimSpace(data) + if len(data) == 0 { + return nil + } + if data[0] == '[' { + var resp []getFolderInfoResp + if err := json.Unmarshal(data, &resp); err != nil { + return err + } + if len(resp) == 0 { + return ErrObjectNotFound + } + *r = GetFolderInfoResp(resp[0]) + return nil + } + var resp getFolderInfoResp + if err := json.Unmarshal(data, &resp); err != nil { + return err + } + *r = GetFolderInfoResp(resp) + return nil +} + +type getFolderInfoResp GetFolderInfoResp + // GetFolderInfo: https://www.yuque.com/115yun/open/rl8zrhe2nag21dfw func (c *Client) GetFolderInfo(ctx context.Context, fileID string) (*GetFolderInfoResp, error) { var resp GetFolderInfoResp diff --git a/fs_test.go b/fs_test.go new file mode 100644 index 0000000..08e6649 --- /dev/null +++ b/fs_test.go @@ -0,0 +1,37 @@ +package sdk + +import ( + "encoding/json" + "errors" + "testing" +) + +func TestGetFolderInfoRespUnmarshalObject(t *testing.T) { + var resp GetFolderInfoResp + err := json.Unmarshal([]byte(`{"file_id":"1","file_name":"dir","file_category":"0"}`), &resp) + if err != nil { + t.Fatal(err) + } + if resp.FileID != "1" || resp.FileName != "dir" || resp.FileCategory != "0" { + t.Fatalf("unexpected response: %+v", resp) + } +} + +func TestGetFolderInfoRespUnmarshalArray(t *testing.T) { + var resp GetFolderInfoResp + err := json.Unmarshal([]byte(`[{"file_id":"1","file_name":"dir","file_category":"0"}]`), &resp) + if err != nil { + t.Fatal(err) + } + if resp.FileID != "1" || resp.FileName != "dir" || resp.FileCategory != "0" { + t.Fatalf("unexpected response: %+v", resp) + } +} + +func TestGetFolderInfoRespUnmarshalEmptyArray(t *testing.T) { + var resp GetFolderInfoResp + err := json.Unmarshal([]byte(`[]`), &resp) + if !errors.Is(err, ErrObjectNotFound) { + t.Fatalf("expected ErrObjectNotFound, got %v", err) + } +}