Before

1package filesystems
2
3import (
4 "io/fs"
5 "strings"
6 "sync"
7)
8
9const (
10 DefaultFilesystemKey = "default"
11)
12
13var DefaultFilesystem = &wrapperFs{key: DefaultFilesystemKey, FS: OsFS{}}
14
15// wrapperFs exists so can easily add to wrapperFs down the line
16type wrapperFs struct {
17 key string
18 fs.FS
19}
20
21// FilesystemMap stores a map of filesystems
22// the empty key will be overwritten to be the default key
23// it includes a default filesystem, based off the os fs
24type FilesystemMap struct {
25 m sync.Map
26}
27
28// note that the first invocation of key cannot be called in a racy context.
29func (f *FilesystemMap) key(k string) string {
30 if k == "" {
31 k = DefaultFilesystemKey
32 }
33 return k
34}
35
36// Register will add the filesystem with key to later be retrieved
37// A call with a nil fs will call unregister, ensuring that a call to Default() will never be nil
38func (f *FilesystemMap) Register(k string, v fs.FS) {
39 k = f.key(k)
40 if v == nil {
41 f.Unregister(k)
42 return
43 }
44 f.m.Store(k, &wrapperFs{key: k, FS: v})
45}
46
47// Unregister will remove the filesystem with key from the filesystem map
48// if the key is the default key, it will set the default to the osFS instead of deleting it
49// modules should call this on cleanup to be safe
50func (f *FilesystemMap) Unregister(k string) {
51 k = f.key(k)
52 if k == DefaultFilesystemKey {
53 f.m.Store(k, DefaultFilesystem)
54 } else {
55 f.m.Delete(k)
56 }
57}
58
59// Get will get a filesystem with a given key
60func (f *FilesystemMap) Get(k string) (v fs.FS, ok bool) {
61 k = f.key(k)
62 c, ok := f.m.Load(strings.TrimSpace(k))
63 if !ok {
64 if k == DefaultFilesystemKey {
65 f.m.Store(k, DefaultFilesystem)
66 return DefaultFilesystem, true
67 }
68 return nil, ok
69 }
70 return c.(fs.FS), true
71}
72
73// Default will get the default filesystem in the filesystem map
74func (f *FilesystemMap) Default() fs.FS {
75 val, _ := f.Get(DefaultFilesystemKey)
76 return val
77}
78

After

1package filesystems
2
3import (
4 "io/fs"
5 "strings"
6 "sync"
7)
8
9const (
10 DefaultFileSystemKey = "default"
11)
12
13var DefaultFileSystem = &wrapperFs{key: DefaultFileSystemKey, FS: OsFS{}}
14
15// wrapperFs exists so can easily add to wrapperFs down the line
16type wrapperFs struct {
17 key string
18 fs.FS
19}
20
21// FileSystemMap stores a map of filesystems
22// the empty key will be overwritten to be the default key
23// it includes a default filesystem, based off the os fs
24type FileSystemMap struct {
25 m sync.Map
26}
27
28// note that the first invocation of key cannot be called in a racy context.
29func (f *FileSystemMap) key(k string) string {
30 if k == "" {
31 k = DefaultFileSystemKey
32 }
33 return k
34}
35
36// Register will add the filesystem with key to later be retrieved
37// A call with a nil fs will call unregister, ensuring that a call to Default() will never be nil
38func (f *FileSystemMap) Register(k string, v fs.FS) {
39 k = f.key(k)
40 if v == nil {
41 f.Unregister(k)
42 return
43 }
44 f.m.Store(k, &wrapperFs{key: k, FS: v})
45}
46
47// Unregister will remove the filesystem with key from the filesystem map
48// if the key is the default key, it will set the default to the osFS instead of deleting it
49// modules should call this on cleanup to be safe
50func (f *FileSystemMap) Unregister(k string) {
51 k = f.key(k)
52 if k == DefaultFileSystemKey {
53 f.m.Store(k, DefaultFileSystem)
54 } else {
55 f.m.Delete(k)
56 }
57}
58
59// Get will get a filesystem with a given key
60func (f *FileSystemMap) Get(k string) (v fs.FS, ok bool) {
61 k = f.key(k)
62 c, ok := f.m.Load(strings.TrimSpace(k))
63 if !ok {
64 if k == DefaultFileSystemKey {
65 f.m.Store(k, DefaultFileSystem)
66 return DefaultFileSystem, true
67 }
68 return nil, ok
69 }
70 return c.(fs.FS), true
71}
72
73// Default will get the default filesystem in the filesystem map
74func (f *FileSystemMap) Default() fs.FS {
75 val, _ := f.Get(DefaultFileSystemKey)
76 return val
77}
78

Before

source_file
package_clause
package "package"
package_identifier "filesystems"
import_declaration
import "import"
import_spec_list
( "("
import_spec
interpreted_string_literal
" "\""
interpreted_string_literal_content "io/fs"
" "\""
import_spec
interpreted_string_literal
" "\""
interpreted_string_literal_content "strings"
" "\""
import_spec
interpreted_string_literal
" "\""
interpreted_string_literal_content "sync"
" "\""
) ")"
const_declaration
const "const"
( "("
const_spec
identifier "DefaultFilesystemKey"
= "="
expression_list
interpreted_string_literal
" "\""
interpreted_string_literal_content "default"
" "\""
) ")"
var_declaration
var "var"
var_spec
identifier "DefaultFilesystem"
= "="
expression_list
unary_expression
& "&"
composite_literal
type_identifier "wrapperFs"
literal_value
{ "{"
keyed_element
literal_element
identifier "key"
: ":"
literal_element
identifier "DefaultFilesystemKey"
, ","
keyed_element
literal_element
identifier "FS"
: ":"
literal_element
composite_literal
type_identifier "OsFS"
literal_value
{ "{"
} "}"
} "}"
comment "// wrapperFs exists so can easily add to wrapperFs down the "...
type_declaration
type "type"
type_spec
type_identifier "wrapperFs"
struct_type
struct "struct"
field_declaration_list
{ "{"
field_declaration
field_identifier "key"
type_identifier "string"
field_declaration
qualified_type
package_identifier "fs"
. "."
type_identifier "FS"
} "}"
comment "// FilesystemMap stores a map of filesystems"
comment "// the empty key will be overwritten to be the default key"
comment "// it includes a default filesystem, based off the os fs"
type_declaration
type "type"
type_spec
type_identifier "FilesystemMap"
struct_type
struct "struct"
field_declaration_list
{ "{"
field_declaration
field_identifier "m"
qualified_type
package_identifier "sync"
. "."
type_identifier "Map"
} "}"
comment "// note that the first invocation of key cannot be called in"...
method_declaration
func "func"
parameter_list
( "("
parameter_declaration
identifier "f"
pointer_type
* "*"
type_identifier "FilesystemMap"
) ")"
field_identifier "key"
parameter_list
( "("
parameter_declaration
identifier "k"
type_identifier "string"
) ")"
type_identifier "string"
block
{ "{"
statement_list
if_statement
if "if"
binary_expression
identifier "k"
== "=="
interpreted_string_literal
" "\""
" "\""
block
{ "{"
statement_list
assignment_statement
expression_list
identifier "k"
= "="
expression_list
identifier "DefaultFilesystemKey"
} "}"
return_statement
return "return"
expression_list
identifier "k"
} "}"
comment "// Register will add the filesystem with key to later be ret"...
comment "// A call with a nil fs will call unregister, ensuring that "...
method_declaration
func "func"
parameter_list
( "("
parameter_declaration
identifier "f"
pointer_type
* "*"
type_identifier "FilesystemMap"
) ")"
field_identifier "Register"
parameter_list
( "("
parameter_declaration
identifier "k"
type_identifier "string"
, ","
parameter_declaration
identifier "v"
qualified_type
package_identifier "fs"
. "."
type_identifier "FS"
) ")"
block (+74 nodes collapsed)
comment "// Unregister will remove the filesystem with key from the f"...
comment "// if the key is the default key, it will set the default to"...
comment "// modules should call this on cleanup to be safe"
method_declaration
func "func"
parameter_list
( "("
parameter_declaration
identifier "f"
pointer_type
* "*"
type_identifier "FilesystemMap"
) ")"
field_identifier "Unregister"
parameter_list
( "("
parameter_declaration
identifier "k"
type_identifier "string"
) ")"
block
{ "{"
statement_list
assignment_statement
expression_list
identifier "k"
= "="
expression_list
call_expression
selector_expression
identifier "f"
. "."
field_identifier "key"
argument_list
( "("
identifier "k"
) ")"
if_statement
if "if"
binary_expression
identifier "k"
== "=="
identifier "DefaultFilesystemKey"
block
{ "{"
statement_list
expression_statement
call_expression
selector_expression
selector_expression
identifier "f"
. "."
field_identifier "m"
. "."
field_identifier "Store"
argument_list
( "("
identifier "k"
, ","
identifier "DefaultFilesystem"
) ")"
} "}"
else "else"
block
{ "{"
statement_list
expression_statement
call_expression
selector_expression
selector_expression
identifier "f"
. "."
field_identifier "m"
. "."
field_identifier "Delete"
argument_list
( "("
identifier "k"
) ")"
} "}"
} "}"
comment "// Get will get a filesystem with a given key"
method_declaration
func "func"
parameter_list
( "("
parameter_declaration
identifier "f"
pointer_type
* "*"
type_identifier "FilesystemMap"
) ")"
field_identifier "Get"
parameter_list
( "("
parameter_declaration
identifier "k"
type_identifier "string"
) ")"
parameter_list
( "("
parameter_declaration
identifier "v"
qualified_type
package_identifier "fs"
. "."
type_identifier "FS"
, ","
parameter_declaration
identifier "ok"
type_identifier "bool"
) ")"
block
{ "{"
statement_list
assignment_statement
expression_list
identifier "k"
= "="
expression_list
call_expression
selector_expression
identifier "f"
. "."
field_identifier "key"
argument_list
( "("
identifier "k"
) ")"
short_var_declaration (+27 nodes collapsed)
if_statement
if "if"
unary_expression
! "!"
identifier "ok"
block
{ "{"
statement_list
if_statement
if "if"
binary_expression
identifier "k"
== "=="
identifier "DefaultFilesystemKey"
block
{ "{"
statement_list
expression_statement
call_expression
selector_expression
selector_expression
identifier "f"
. "."
field_identifier "m"
. "."
field_identifier "Store"
argument_list
( "("
identifier "k"
, ","
identifier "DefaultFilesystem"
) ")"
return_statement
return "return"
expression_list
identifier "DefaultFilesystem"
, ","
true "true"
} "}"
return_statement
return "return"
expression_list
nil "nil"
, ","
identifier "ok"
} "}"
return_statement
return "return"
expression_list
type_assertion_expression
identifier "c"
. "."
( "("
qualified_type
package_identifier "fs"
. "."
type_identifier "FS"
) ")"
, ","
true "true"
} "}"
comment "// Default will get the default filesystem in the filesystem"...
method_declaration
func "func"
parameter_list
( "("
parameter_declaration
identifier "f"
pointer_type
* "*"
type_identifier "FilesystemMap"
) ")"
field_identifier "Default"
parameter_list
( "("
) ")"
qualified_type
package_identifier "fs"
. "."
type_identifier "FS"
block
{ "{"
statement_list
short_var_declaration
expression_list
identifier "val"
, ","
identifier "_"
:= ":="
expression_list
call_expression
selector_expression
identifier "f"
. "."
field_identifier "Get"
argument_list
( "("
identifier "DefaultFilesystemKey"
) ")"
return_statement
return "return"
expression_list
identifier "val"
} "}"

After

source_file
package_clause
package "package"
package_identifier "filesystems"
import_declaration
import "import"
import_spec_list
( "("
import_spec
interpreted_string_literal
" "\""
interpreted_string_literal_content "io/fs"
" "\""
import_spec
interpreted_string_literal
" "\""
interpreted_string_literal_content "strings"
" "\""
import_spec
interpreted_string_literal
" "\""
interpreted_string_literal_content "sync"
" "\""
) ")"
const_declaration
const "const"
( "("
const_spec
identifier "DefaultFileSystemKey"
= "="
expression_list
interpreted_string_literal
" "\""
interpreted_string_literal_content "default"
" "\""
) ")"
var_declaration
var "var"
var_spec
identifier "DefaultFileSystem"
= "="
expression_list
unary_expression
& "&"
composite_literal
type_identifier "wrapperFs"
literal_value
{ "{"
keyed_element
literal_element
identifier "key"
: ":"
literal_element
identifier "DefaultFileSystemKey"
, ","
keyed_element
literal_element
identifier "FS"
: ":"
literal_element
composite_literal
type_identifier "OsFS"
literal_value
{ "{"
} "}"
} "}"
comment "// wrapperFs exists so can easily add to wrapperFs down the "...
type_declaration
type "type"
type_spec
type_identifier "wrapperFs"
struct_type
struct "struct"
field_declaration_list
{ "{"
field_declaration
field_identifier "key"
type_identifier "string"
field_declaration
qualified_type
package_identifier "fs"
. "."
type_identifier "FS"
} "}"
comment "// FileSystemMap stores a map of filesystems"
comment "// the empty key will be overwritten to be the default key"
comment "// it includes a default filesystem, based off the os fs"
type_declaration
type "type"
type_spec
type_identifier "FileSystemMap"
struct_type
struct "struct"
field_declaration_list
{ "{"
field_declaration
field_identifier "m"
qualified_type
package_identifier "sync"
. "."
type_identifier "Map"
} "}"
comment "// note that the first invocation of key cannot be called in"...
method_declaration
func "func"
parameter_list
( "("
parameter_declaration
identifier "f"
pointer_type
* "*"
type_identifier "FileSystemMap"
) ")"
field_identifier "key"
parameter_list
( "("
parameter_declaration
identifier "k"
type_identifier "string"
) ")"
type_identifier "string"
block
{ "{"
statement_list
if_statement
if "if"
binary_expression
identifier "k"
== "=="
interpreted_string_literal
" "\""
" "\""
block
{ "{"
statement_list
assignment_statement
expression_list
identifier "k"
= "="
expression_list
identifier "DefaultFileSystemKey"
} "}"
return_statement
return "return"
expression_list
identifier "k"
} "}"
comment "// Register will add the filesystem with key to later be ret"...
comment "// A call with a nil fs will call unregister, ensuring that "...
method_declaration
func "func"
parameter_list
( "("
parameter_declaration
identifier "f"
pointer_type
* "*"
type_identifier "FileSystemMap"
) ")"
field_identifier "Register"
parameter_list
( "("
parameter_declaration
identifier "k"
type_identifier "string"
, ","
parameter_declaration
identifier "v"
qualified_type
package_identifier "fs"
. "."
type_identifier "FS"
) ")"
block (+74 nodes collapsed)
comment "// Unregister will remove the filesystem with key from the f"...
comment "// if the key is the default key, it will set the default to"...
comment "// modules should call this on cleanup to be safe"
method_declaration
func "func"
parameter_list
( "("
parameter_declaration
identifier "f"
pointer_type
* "*"
type_identifier "FileSystemMap"
) ")"
field_identifier "Unregister"
parameter_list
( "("
parameter_declaration
identifier "k"
type_identifier "string"
) ")"
block
{ "{"
statement_list
assignment_statement
expression_list
identifier "k"
= "="
expression_list
call_expression
selector_expression
identifier "f"
. "."
field_identifier "key"
argument_list
( "("
identifier "k"
) ")"
if_statement
if "if"
binary_expression
identifier "k"
== "=="
identifier "DefaultFileSystemKey"
block
{ "{"
statement_list
expression_statement
call_expression
selector_expression
selector_expression
identifier "f"
. "."
field_identifier "m"
. "."
field_identifier "Store"
argument_list
( "("
identifier "k"
, ","
identifier "DefaultFileSystem"
) ")"
} "}"
else "else"
block
{ "{"
statement_list
expression_statement
call_expression
selector_expression
selector_expression
identifier "f"
. "."
field_identifier "m"
. "."
field_identifier "Delete"
argument_list
( "("
identifier "k"
) ")"
} "}"
} "}"
comment "// Get will get a filesystem with a given key"
method_declaration
func "func"
parameter_list
( "("
parameter_declaration
identifier "f"
pointer_type
* "*"
type_identifier "FileSystemMap"
) ")"
field_identifier "Get"
parameter_list
( "("
parameter_declaration
identifier "k"
type_identifier "string"
) ")"
parameter_list
( "("
parameter_declaration
identifier "v"
qualified_type
package_identifier "fs"
. "."
type_identifier "FS"
, ","
parameter_declaration
identifier "ok"
type_identifier "bool"
) ")"
block
{ "{"
statement_list
assignment_statement
expression_list
identifier "k"
= "="
expression_list
call_expression
selector_expression
identifier "f"
. "."
field_identifier "key"
argument_list
( "("
identifier "k"
) ")"
short_var_declaration (+27 nodes collapsed)
if_statement
if "if"
unary_expression
! "!"
identifier "ok"
block
{ "{"
statement_list
if_statement
if "if"
binary_expression
identifier "k"
== "=="
identifier "DefaultFileSystemKey"
block
{ "{"
statement_list
expression_statement
call_expression
selector_expression
selector_expression
identifier "f"
. "."
field_identifier "m"
. "."
field_identifier "Store"
argument_list
( "("
identifier "k"
, ","
identifier "DefaultFileSystem"
) ")"
return_statement
return "return"
expression_list
identifier "DefaultFileSystem"
, ","
true "true"
} "}"
return_statement
return "return"
expression_list
nil "nil"
, ","
identifier "ok"
} "}"
return_statement
return "return"
expression_list
type_assertion_expression
identifier "c"
. "."
( "("
qualified_type
package_identifier "fs"
. "."
type_identifier "FS"
) ")"
, ","
true "true"
} "}"
comment "// Default will get the default filesystem in the filesystem"...
method_declaration
func "func"
parameter_list
( "("
parameter_declaration
identifier "f"
pointer_type
* "*"
type_identifier "FileSystemMap"
) ")"
field_identifier "Default"
parameter_list
( "("
) ")"
qualified_type
package_identifier "fs"
. "."
type_identifier "FS"
block
{ "{"
statement_list
short_var_declaration
expression_list
identifier "val"
, ","
identifier "_"
:= ":="
expression_list
call_expression
selector_expression
identifier "f"
. "."
field_identifier "Get"
argument_list
( "("
identifier "DefaultFileSystemKey"
) ")"
return_statement
return "return"
expression_list
identifier "val"
} "}"