//go:build darwin package main import ( "encoding/json" "fmt" "os" "sync/atomic" ) type jsonOutput struct { Path string `json:"path"` Entries []jsonEntry `json:"entries"` TotalSize int64 `json:"total_size"` TotalFiles int64 `json:"total_files"` } type jsonEntry struct { Name string `json:"name"` Path string `json:"path"` Size int64 `json:"size"` IsDir bool `json:"is_dir"` } func runJSONMode(path string, isOverview bool) { result := performScanForJSON(path) encoder := json.NewEncoder(os.Stdout) encoder.SetIndent("", " ") if err := encoder.Encode(result); err != nil { fmt.Fprintf(os.Stderr, "failed to encode JSON: %v\n", err) os.Exit(1) } } func performScanForJSON(path string) jsonOutput { var filesScanned, dirsScanned, bytesScanned int64 currentPath := &atomic.Value{} currentPath.Store("") items, err := os.ReadDir(path) if err != nil { fmt.Fprintf(os.Stderr, "failed to read directory: %v\n", err) os.Exit(1) } var entries []jsonEntry var totalSize int64 for _, item := range items { fullPath := path + "/" + item.Name() var size int64 if item.IsDir() { size = calculateDirSizeFast(fullPath, &filesScanned, &dirsScanned, &bytesScanned, currentPath) } else { info, err := item.Info() if err == nil { size = info.Size() } } totalSize += size entries = append(entries, jsonEntry{ Name: item.Name(), Path: fullPath, Size: size, IsDir: item.IsDir(), }) } return jsonOutput{ Path: path, Entries: entries, TotalSize: totalSize, TotalFiles: filesScanned, } }