@@ -82,6 +82,53 @@ function State:remove(name)
82
82
end
83
83
end
84
84
85
+ --- @return string[] | nil pruned , string ? error , string ? error_kind
86
+ function State :prune (ttl_msec )
87
+ local function current_time ()
88
+ local name = os.tmpname ()
89
+ local fd , err , err_kind = vim .loop .fs_open (name , " r" , 438 )
90
+ if not fd then
91
+ return nil , err , err_kind
92
+ end
93
+
94
+ local stat , err , err_kind = vim .loop .fs_fstat (fd )
95
+ if not stat then
96
+ return nil , err , err_kind
97
+ end
98
+
99
+ assert (vim .loop .fs_close (fd ))
100
+ assert (vim .loop .fs_unlink (name ))
101
+
102
+ return stat .mtime .sec , nil , nil
103
+ end
104
+
105
+ local now , err , err_kind = current_time ()
106
+ if not now then
107
+ return nil , err , err_kind
108
+ end
109
+
110
+ local pruned = {}
111
+
112
+ for name , _ in vim .fs .dir (self .save_dir ) do
113
+ local path = Path .join (self .save_dir , name )
114
+
115
+ --- @diagnostic disable-next-line : redefined-local
116
+ local stat , err , err_kind = vim .loop .fs_stat (path )
117
+ if not stat then
118
+ return err , err_kind
119
+ end
120
+
121
+ local elapsed_msec = now - stat .mtime .sec
122
+ if elapsed_msec > ttl_msec then
123
+ name = path_decode (name )
124
+ name = string.gsub (name , " %.json" , " " )
125
+ table.insert (pruned , path_decode (name ))
126
+ end
127
+ end
128
+
129
+ return pruned , nil , nil
130
+ end
131
+
85
132
--- @param name string
86
133
--- @return any decoded , string ? error , string ? error_kind
87
134
function State :read (name )
0 commit comments