From e3bedfa9f8deb9644caf99ef9ce74c9cee07ffd1 Mon Sep 17 00:00:00 2001 From: caixw Date: Thu, 18 Apr 2024 14:51:13 +0800 Subject: [PATCH] =?UTF-8?q?feat(validator):=20=E6=B7=BB=E5=8A=A0=E9=92=88?= =?UTF-8?q?=E5=AF=B9=E6=96=87=E4=BB=B6=E7=9A=84=E9=AA=8C=E8=AF=81=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- go.mod | 22 ++++++++++----------- go.sum | 44 +++++++++++++++++++++--------------------- validator/file.go | 39 +++++++++++++++++++++++++++++++++++++ validator/file_test.go | 36 ++++++++++++++++++++++++++++++++++ 4 files changed, 108 insertions(+), 33 deletions(-) create mode 100644 validator/file.go create mode 100644 validator/file_test.go diff --git a/go.mod b/go.mod index 94f353d..ed53b60 100644 --- a/go.mod +++ b/go.mod @@ -4,9 +4,9 @@ go 1.22.0 require ( github.com/google/uuid v1.6.0 - github.com/issue9/assert/v4 v4.1.1 + github.com/issue9/assert/v4 v4.2.0 github.com/issue9/version v1.0.8 - github.com/issue9/web v0.89.0 + github.com/issue9/web v0.92.0 ) require ( @@ -16,18 +16,18 @@ require ( github.com/issue9/conv v1.3.5 // indirect github.com/issue9/errwrap v0.3.2 // indirect github.com/issue9/localeutil v0.26.5 // indirect - github.com/issue9/logs/v7 v7.5.1 // indirect - github.com/issue9/mux/v7 v7.4.2 // indirect + github.com/issue9/logs/v7 v7.6.0 // indirect + github.com/issue9/mux/v8 v8.1.0 // indirect github.com/issue9/query/v3 v3.1.3 // indirect - github.com/issue9/scheduled v0.19.4 // indirect - github.com/issue9/sliceutil v0.16.0 // indirect - github.com/issue9/source v0.8.3 // indirect - github.com/issue9/term/v3 v3.2.7 // indirect + github.com/issue9/scheduled v0.19.5 // indirect + github.com/issue9/sliceutil v0.16.1 // indirect + github.com/issue9/source v0.9.1 // indirect + github.com/issue9/term/v3 v3.2.8 // indirect github.com/jellydator/ttlcache/v3 v3.2.0 // indirect - github.com/klauspost/compress v1.17.7 // indirect - golang.org/x/mod v0.16.0 // indirect + github.com/klauspost/compress v1.17.8 // indirect + golang.org/x/mod v0.17.0 // indirect golang.org/x/sync v0.1.0 // indirect - golang.org/x/sys v0.18.0 // indirect + golang.org/x/sys v0.19.0 // indirect golang.org/x/text v0.14.0 // indirect golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 // indirect ) diff --git a/go.sum b/go.sum index b4f86d3..2371390 100644 --- a/go.sum +++ b/go.sum @@ -4,8 +4,8 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/issue9/assert/v4 v4.1.1 h1:OhPE8SB8n/qZCNGLQa+6MQtr/B3oON0JAVj68k8jJlc= -github.com/issue9/assert/v4 v4.1.1/go.mod h1:v7qDRXi7AsaZZNh8eAK2rkLJg5/clztqQGA1DRv9Lv4= +github.com/issue9/assert/v4 v4.2.0 h1:XJGMFYW0xfESqFRPLWbSsr0xWdkofytvQbDfNb5n9fw= +github.com/issue9/assert/v4 v4.2.0/go.mod h1:v7qDRXi7AsaZZNh8eAK2rkLJg5/clztqQGA1DRv9Lv4= github.com/issue9/cache v0.12.0 h1:NiDBuN9x22H4UJsOMDoEuIFA8r3qNqPqO9vyzzcvzoY= github.com/issue9/cache v0.12.0/go.mod h1:0s9j7qiKv4uWYqz0D2N2H7bIBvmtD+903h5GqnxW6i4= github.com/issue9/config v0.6.2 h1:znXvsk6gh0wm+fTEn0zUjjramKuOLY8Jt0ZTxp4GIkc= @@ -16,44 +16,44 @@ github.com/issue9/errwrap v0.3.2 h1:7KEme9Pfe75M+sIMcPCn/DV90wjnOcRbO4DXVAHj3Fw= github.com/issue9/errwrap v0.3.2/go.mod h1:KcCLuUGiffjooLCUjL89r1cyO8/HT/VRcQrneO53N3A= github.com/issue9/localeutil v0.26.5 h1:e78b6cOOtgzfb4g4U9uPLC8QyK6Lux+s7ZiQe+6iM1A= github.com/issue9/localeutil v0.26.5/go.mod h1:BJXJwcAT9CyyVZOlqfmq+B5FcPbqGxGjYnTYbVuiMM8= -github.com/issue9/logs/v7 v7.5.1 h1:H1ua+3C0Nm6LZt4gEFhKZiyHhzyYEkPVYJDtt+1jmvQ= -github.com/issue9/logs/v7 v7.5.1/go.mod h1:UA05C4wF8vrrQp13QV1ncNqI/6nJ8R1c/dpOOcbSKFQ= -github.com/issue9/mux/v7 v7.4.2 h1:BIuHX7g3RctaVlu4dCf6drrTT6GzToo0T3/d7dGCcOs= -github.com/issue9/mux/v7 v7.4.2/go.mod h1:NQ5vH/HD3QDil227u5DGT9PN9IP7j/Dx7+cSSEBgvhM= +github.com/issue9/logs/v7 v7.6.0 h1:dvY1ctPROdd2YaOwYRNOkfbmMx+8OM0w53t8bWrWg9s= +github.com/issue9/logs/v7 v7.6.0/go.mod h1:7Hx1vnAojUciyFdqNlMiwsBJRGBc/P2Yrjt7ACm9Uno= +github.com/issue9/mux/v8 v8.1.0 h1:NZmQv0iE0ocn1oyHWKZWY+PIVcbpZYdaDImJ3+WJ/28= +github.com/issue9/mux/v8 v8.1.0/go.mod h1:ivUHUcMzoTPxvjC33XrsWJ68fnw5vEjJ0y1GcuMrg84= github.com/issue9/query/v3 v3.1.3 h1:Y6ETEYXxaKqhpM4lXPKCffhJ72VuKQbrAwgwHlacu0Y= github.com/issue9/query/v3 v3.1.3/go.mod h1:a/W/+7iel9K+5rRT4AFAKR8+OJeV5axeF6tK9My4lNA= github.com/issue9/rands/v3 v3.0.1 h1:EnX9WNushGgHCzoL/R5eBPaLfvjLO/c7CGHNgLK0JhY= github.com/issue9/rands/v3 v3.0.1/go.mod h1:n4mM2ts7NCpuxHwS9zorPITJBWEUGksXg6cTOH6yqS0= -github.com/issue9/scheduled v0.19.4 h1:Wg9S7rOmMpn2O0F1OVb51o8FYGibdMjPkElgjEKcYK4= -github.com/issue9/scheduled v0.19.4/go.mod h1:S63DdPErP0aXsEnUzc27F+v0koMf+2V4V+CpY7tvr8o= -github.com/issue9/sliceutil v0.16.0 h1:+gyumWF126mprQLiUi14s6SAeucMg1vuyPEh66VTtC8= -github.com/issue9/sliceutil v0.16.0/go.mod h1:ldun6sT4/bOJxuMtOXhtc6P7GCwE7L+avV86HNks7qk= -github.com/issue9/source v0.8.3 h1:MH883uljg0fupE/qkqJm3RqA5/l40KR+HsR7Mp3zjYY= -github.com/issue9/source v0.8.3/go.mod h1:H0Joo5go08sIMODLvQXpWwiWpGrH2MiTMFhKBZhVbH8= -github.com/issue9/term/v3 v3.2.7 h1:esfhoinbQ65P3oFscXhticrDFOgZJQqUwL/IC70HiWc= -github.com/issue9/term/v3 v3.2.7/go.mod h1:DvA/fPiKzX11P/ZoVWJG5QMVpI0ia+uqiU31iZV2jHE= +github.com/issue9/scheduled v0.19.5 h1:SKNzZm7mkm9ChtKun3mgcDBBF4hB/+uhEmY6JLtvJLE= +github.com/issue9/scheduled v0.19.5/go.mod h1:agacfy7vohhXTu+2z+wjOTlP2X64hlM8xu3zWDE/euw= +github.com/issue9/sliceutil v0.16.1 h1:NVZ2feN014oUmMpZvZUrKkKMGhAfzT8WNzJF81krebM= +github.com/issue9/sliceutil v0.16.1/go.mod h1:ldun6sT4/bOJxuMtOXhtc6P7GCwE7L+avV86HNks7qk= +github.com/issue9/source v0.9.1 h1:duANl/q03NzDtZN5sOPia+s4vBu8c1CqtHGoluY0Tto= +github.com/issue9/source v0.9.1/go.mod h1:8L8ef8XhMftlE2ZQ8j60h5hTGlQmPjm/8zvoXr5fnTY= +github.com/issue9/term/v3 v3.2.8 h1:vAtsr9FLwrDQRyU7S8AOUI3f+QrYsXVHT/kee9MuMkk= +github.com/issue9/term/v3 v3.2.8/go.mod h1:S/xLgjEXJNr7C6UhcGTEOV5k94mzHRcYMmtvhLJoX6A= github.com/issue9/unique/v2 v2.1.0 h1:lE9hstenrbBgDM/Iulv7d75qAYpgoDV8rSRoLmEBHOk= github.com/issue9/unique/v2 v2.1.0/go.mod h1:qZoDKnfu+7Q0yxhifVseRKD2Wea9Tc9zdXwALnFc54A= github.com/issue9/version v1.0.8 h1:IsNdDYdV8UGDGwwgp8H4RszJE0Ko26HjWg9pZzyOivs= github.com/issue9/version v1.0.8/go.mod h1:w8bQwODBOG5+iaS3qIJbElxxpp3Uo4x5F39qKBqwpdc= -github.com/issue9/web v0.89.0 h1:hfyhMWqJv8dumZZkT2kXcV3sDwkM1GjjcTjMGuk53IM= -github.com/issue9/web v0.89.0/go.mod h1:CnDJ05ITcOTVVdAnc3tLBpV7aYqUW6j5FOEiJtA5GdU= +github.com/issue9/web v0.92.0 h1:yheONHWMXXf3/qdbhKiRfUfSJIHK13zsnkSVd5pfQoM= +github.com/issue9/web v0.92.0/go.mod h1:IIVT/CPr/uyZcYj+RVR2yk7qMIvHk7LDycEQU5VlABo= github.com/jellydator/ttlcache/v3 v3.2.0 h1:6lqVJ8X3ZaUwvzENqPAobDsXNExfUJd61u++uW8a3LE= github.com/jellydator/ttlcache/v3 v3.2.0/go.mod h1:hi7MGFdMAwZna5n2tuvh63DvFLzVKySzCVW6+0gA2n4= -github.com/klauspost/compress v1.17.7 h1:ehO88t2UGzQK66LMdE8tibEd1ErmzZjNEqWkjLAKQQg= -github.com/klauspost/compress v1.17.7/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= +github.com/klauspost/compress v1.17.8 h1:YcnTYrq7MikUT7k0Yb5eceMmALQPYBW/Xltxn0NAMnU= +github.com/klauspost/compress v1.17.8/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.8.2 h1:+h33VjcLVPDHtOdpUCuF+7gSuG3yGIftsP1YvFihtJ8= github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= go.uber.org/goleak v1.2.1 h1:NBol2c7O1ZokfZ0LEU9K6Whx/KnwvepVetCUhtKja4A= go.uber.org/goleak v1.2.1/go.mod h1:qlT2yGI9QafXHhZZLxlSuNsMw3FFLxBr+tBRlmO1xH4= -golang.org/x/mod v0.16.0 h1:QX4fJ0Rr5cPQCF7O9lh9Se4pmwfwskqZfq5moyldzic= -golang.org/x/mod v0.16.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/mod v0.17.0 h1:zY54UmvipHiNd+pm+m0x9KhZ9hl1/7QNMyxXbc6ICqA= +golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= -golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.19.0 h1:q5f1RH2jigJ1MoAWp2KTp3gm5zAGFUTarQZ5U386+4o= +golang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 h1:+cNy6SZtPcJQH3LJVLOSmiC7MMxXNOb3PU/VUEz+EhU= diff --git a/validator/file.go b/validator/file.go new file mode 100644 index 0000000..abf8a68 --- /dev/null +++ b/validator/file.go @@ -0,0 +1,39 @@ +// SPDX-FileCopyrightText: 2024 caixw +// +// SPDX-License-Identifier: MIT + +package validator + +import ( + "errors" + "io/fs" + "os" +) + +// FileExists path 是否存在 +func FileExists(path string) bool { + _, err := os.Stat(path) + return err == nil || !errors.Is(err, fs.ErrNotExist) +} + +// IsDir path 是否为一个目录 +func IsDir(path string) bool { + s, err := os.Stat(path) + return err == nil && s.IsDir() +} + +// FileExistsFS 判断文件是否存在于 fsys +func FileExistsFS(fsys fs.FS) func(string) bool { + return func(path string) bool { + _, err := fs.Stat(fsys, path) + return err == nil || !errors.Is(err, fs.ErrNotExist) + } +} + +// IsDirFS 判断 fsys 中的 path 是否为目录 +func IsDirFS(fsys fs.FS) func(string) bool { + return func(path string) bool { + s, err := os.Stat(path) + return err == nil && s.IsDir() + } +} diff --git a/validator/file_test.go b/validator/file_test.go new file mode 100644 index 0000000..17cc779 --- /dev/null +++ b/validator/file_test.go @@ -0,0 +1,36 @@ +// SPDX-FileCopyrightText: 2024 caixw +// +// SPDX-License-Identifier: MIT + +package validator + +import ( + "os" + "testing" + + "github.com/issue9/assert/v4" +) + +func TestFileExists(t *testing.T) { + a := assert.New(t, false) + + a.True(FileExists("./file.go")). + False(FileExists("./not-exists.go")) + + f := FileExistsFS(os.DirFS("./")) + a.True(f("file.go")). + False(f("not-exists.go")) +} + +func TestIsDir(t *testing.T) { + a := assert.New(t, false) + + a.True(IsDir(".")). + False(IsDir("./file.go")). + False(IsDir("not-exists.go")) + + f := IsDirFS(os.DirFS("./")) + a.True(f(".")). + False(f("file.go")). + False(f("not-exists.go")) +}