summaryrefslogtreecommitdiff
path: root/internal/ui/restore/json.go
diff options
context:
space:
mode:
Diffstat (limited to 'internal/ui/restore/json.go')
-rw-r--r--internal/ui/restore/json.go69
1 files changed, 69 insertions, 0 deletions
diff --git a/internal/ui/restore/json.go b/internal/ui/restore/json.go
new file mode 100644
index 000000000..c1b95b00b
--- /dev/null
+++ b/internal/ui/restore/json.go
@@ -0,0 +1,69 @@
+package restore
+
+import (
+ "time"
+
+ "github.com/restic/restic/internal/ui"
+)
+
+type jsonPrinter struct {
+ terminal term
+}
+
+func NewJSONProgress(terminal term) ProgressPrinter {
+ return &jsonPrinter{
+ terminal: terminal,
+ }
+}
+
+func (t *jsonPrinter) print(status interface{}) {
+ t.terminal.Print(ui.ToJSONString(status))
+}
+
+func (t *jsonPrinter) Update(filesFinished, filesTotal, allBytesWritten, allBytesTotal uint64, duration time.Duration) {
+ status := statusUpdate{
+ MessageType: "status",
+ SecondsElapsed: uint64(duration / time.Second),
+ TotalFiles: filesTotal,
+ FilesRestored: filesFinished,
+ TotalBytes: allBytesTotal,
+ BytesRestored: allBytesWritten,
+ }
+
+ if allBytesTotal > 0 {
+ status.PercentDone = float64(allBytesWritten) / float64(allBytesTotal)
+ }
+
+ t.print(status)
+}
+
+func (t *jsonPrinter) Finish(filesFinished, filesTotal, allBytesWritten, allBytesTotal uint64, duration time.Duration) {
+ status := summaryOutput{
+ MessageType: "summary",
+ SecondsElapsed: uint64(duration / time.Second),
+ TotalFiles: filesTotal,
+ FilesRestored: filesFinished,
+ TotalBytes: allBytesTotal,
+ BytesRestored: allBytesWritten,
+ }
+ t.print(status)
+}
+
+type statusUpdate struct {
+ MessageType string `json:"message_type"` // "status"
+ SecondsElapsed uint64 `json:"seconds_elapsed,omitempty"`
+ PercentDone float64 `json:"percent_done"`
+ TotalFiles uint64 `json:"total_files,omitempty"`
+ FilesRestored uint64 `json:"files_restored,omitempty"`
+ TotalBytes uint64 `json:"total_bytes,omitempty"`
+ BytesRestored uint64 `json:"bytes_restored,omitempty"`
+}
+
+type summaryOutput struct {
+ MessageType string `json:"message_type"` // "summary"
+ SecondsElapsed uint64 `json:"seconds_elapsed,omitempty"`
+ TotalFiles uint64 `json:"total_files,omitempty"`
+ FilesRestored uint64 `json:"files_restored,omitempty"`
+ TotalBytes uint64 `json:"total_bytes,omitempty"`
+ BytesRestored uint64 `json:"bytes_restored,omitempty"`
+}