package transform import ( "fmt" "strings" "sync" "github.com/rclone/rclone/fs" "golang.org/x/text/encoding/charmap") var ( cmaps = map[int]*charmap.Charmap{} lock sync.Mutex) // CharmapChoices is an enum of the character map choices.type CharmapChoices = fs.Enum[cmapChoices] type cmapChoices struct{} func (cmapChoices) Choices() []string { choices := []string{} i := 0 for _, enc := range charmap.All { c, ok := enc.(*charmap.Charmap) if !ok { continue } name := strings.ReplaceAll(c.String(), " ", "-") if name == "" { name = fmt.Sprintf("unknown-%d", i) } lock.Lock() cmaps[i] = c lock.Unlock() choices = append(choices, name) i++ } return choices} func (cmapChoices) Type() string { return "string"} func charmapByID(cm fs.Enum[cmapChoices]) *charmap.Charmap { lock.Lock() c, ok := cmaps[int(cm)] lock.Unlock() if ok { return c } return nil} func encodeWithReplacement(s string, cmap *charmap.Charmap) string { return strings.Map(func(r rune) rune { b, ok := cmap.EncodeRune(r) if !ok { return '_' } return cmap.DecodeByte(b) }, s)} func toASCII(s string) string { return strings.Map(func(r rune) rune { if r <= 127 { return r } return -1 }, s)}
package transform
import (
"fmt"
"strings"
"sync"
"github.com/rclone/rclone/fs"
"golang.org/x/text/encoding/charmap"
)
var (
cmaps = map[int]*charmap.Charmap{}
lock sync.Mutex
)
// CharmapChoices is an enum of the character map choices.
type CharmapChoices = fs.Enum[cmapChoices]
type cmapChoices struct{}
func (cmapChoices) Choices() []string {
choices := []string{}
i := 0
for _, enc := range charmap.All {
c, ok := enc.(*charmap.Charmap)
if !ok {
continue
}
name := strings.ReplaceAll(c.String(), " ", "-")
if name == "" {
name = fmt.Sprintf("unknown-%d", i)
}
lock.Lock()
cmaps[i] = c
lock.Unlock()
choices = append(choices, name)
i++
}
return choices
}
func (cmapChoices) Type() string {
return "string"
}
func charmapByID(cm fs.Enum[cmapChoices]) *charmap.Charmap {
lock.Lock()
c, ok := cmaps[int(cm)]
lock.Unlock()
if ok {
return c
}
return nil
}
func encodeWithReplacement(s string, cmap *charmap.Charmap) string {
return strings.Map(func(r rune) rune {
b, ok := cmap.EncodeRune(r)
if !ok {
return '_'
}
return cmap.DecodeByte(b)
}, s)
}
func toASCII(s string) string {
return strings.Map(func(r rune) rune {
if r <= 127 {
return r
}
return -1
}, s)
}