Skip to content

Commit

Permalink
Separated default System struct as a package.
Browse files Browse the repository at this point in the history
  • Loading branch information
DECE2183 committed Jan 6, 2024
1 parent c068f45 commit cabf01b
Show file tree
Hide file tree
Showing 3 changed files with 122 additions and 109 deletions.
120 changes: 120 additions & 0 deletions builtin/default_system/default_system.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,120 @@
package defaultsystem

import (
"fmt"
"io"
"os"
"path"
"time"

"github.com/dece2183/hexowl/builtin"
"github.com/dece2183/hexowl/input/terminal"
)

var DefaultSystem builtin.System

func init() {
DefaultSystem = builtin.System{
HighlightEnabled: true,
Stdout: os.Stdout,
ClearScreen: sysClearScreen,
RandomSeed: time.Now().UnixNano(),
ListEnvironments: sysListEnv,
WriteEnvironment: sysWriteEnv,
ReadEnvironment: sysReadEnv,
Exit: sysExit,
}
builtin.SystemInit(DefaultSystem)
}

func sysClearScreen() {
fmt.Fprintf(DefaultSystem.Stdout, "\x1bc")
}

func sysGetEnvPath(envName string) (string, error) {
userDir, err := os.UserHomeDir()
if err != nil {
return "", fmt.Errorf("unable to get home directory")
}

saveDir := path.Join(userDir, ".hexowl/environment")
err = os.MkdirAll(saveDir, 0666)
if err != nil {
return "", fmt.Errorf("unable to make directory")
}

return path.Join(saveDir, envName) + ".json", nil
}

func sysListEnv() ([]string, error) {
userDir, err := os.UserHomeDir()
if err != nil {
return nil, fmt.Errorf("unable to get home directory")
}
envDir := path.Join(userDir, ".hexowl/environment")
err = os.MkdirAll(envDir, 0666)
if err != nil {
return nil, fmt.Errorf("unable to make directory")
}

dir, err := os.Open(envDir)
if err != nil {
return nil, fmt.Errorf("unable to open directory")
}
defer dir.Close()

files, err := dir.Readdir(0)
if err != nil {
return nil, fmt.Errorf("unable to read directory")
}

envs := make([]string, 0, len(files))
for _, f := range files {
if f.IsDir() {
continue
}

name := f.Name()
ext := path.Ext(name)
if ext != ".json" {
continue
}

envs = append(envs, name[:len(name)-len(ext)])
}

return envs, nil
}

func sysWriteEnv(name string) (io.WriteCloser, error) {
envPath, err := sysGetEnvPath(name)
if err != nil {
return nil, err
}

f, err := os.OpenFile(envPath, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0755)
if err != nil {
return nil, fmt.Errorf("unable to create file")
}

return f, nil
}

func sysReadEnv(name string) (io.ReadCloser, error) {
envPath, err := sysGetEnvPath(name)
if err != nil {
return nil, err
}

f, err := os.OpenFile(envPath, os.O_RDONLY, 0755)
if err != nil {
return nil, fmt.Errorf("unable to open file")
}

return f, nil
}

func sysExit(errCode int) {
terminal.DisableRawMode()
os.Exit(errCode)
}
110 changes: 1 addition & 109 deletions builtin/system.go
Original file line number Diff line number Diff line change
@@ -1,14 +1,9 @@
package builtin

import (
"fmt"
"io"
"math/rand"
"os"
"path"
"time"

"github.com/dece2183/hexowl/input/terminal"
"github.com/dece2183/hexowl/user"
)

Expand Down Expand Up @@ -46,114 +41,11 @@ type descriptor struct {
system System
}

var defaultSystem = System{
HighlightEnabled: true,
Stdout: os.Stdout,
ClearScreen: sysClearScreen,
RandomSeed: time.Now().UnixNano(),
ListEnvironments: sysListEnv,
WriteEnvironment: sysWriteEnv,
ReadEnvironment: sysReadEnv,
Exit: sysExit,
}

var bDesc descriptor

func init() {
bDesc.functions = &functions
SystemInit(defaultSystem)
}

func sysClearScreen() {
fmt.Fprintf(bDesc.system.Stdout, "\x1bc")
}

func sysGetEnvPath(envName string) (string, error) {
userDir, err := os.UserHomeDir()
if err != nil {
return "", fmt.Errorf("unable to get home directory")
}

saveDir := path.Join(userDir, ".hexowl/environment")
err = os.MkdirAll(saveDir, 0666)
if err != nil {
return "", fmt.Errorf("unable to make directory")
}

return path.Join(saveDir, envName) + ".json", nil
}

func sysListEnv() ([]string, error) {
userDir, err := os.UserHomeDir()
if err != nil {
return nil, fmt.Errorf("unable to get home directory")
}
envDir := path.Join(userDir, ".hexowl/environment")
err = os.MkdirAll(envDir, 0666)
if err != nil {
return nil, fmt.Errorf("unable to make directory")
}

dir, err := os.Open(envDir)
if err != nil {
return nil, fmt.Errorf("unable to open directory")
}
defer dir.Close()

files, err := dir.Readdir(0)
if err != nil {
return nil, fmt.Errorf("unable to read directory")
}

envs := make([]string, 0, len(files))
for _, f := range files {
if f.IsDir() {
continue
}

name := f.Name()
ext := path.Ext(name)
if ext != ".json" {
continue
}

envs = append(envs, name[:len(name)-len(ext)])
}

return envs, nil
}

func sysWriteEnv(name string) (io.WriteCloser, error) {
envPath, err := sysGetEnvPath(name)
if err != nil {
return nil, err
}

f, err := os.OpenFile(envPath, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0755)
if err != nil {
return nil, fmt.Errorf("unable to create file")
}

return f, nil
}

func sysReadEnv(name string) (io.ReadCloser, error) {
envPath, err := sysGetEnvPath(name)
if err != nil {
return nil, err
}

f, err := os.OpenFile(envPath, os.O_RDONLY, 0755)
if err != nil {
return nil, fmt.Errorf("unable to open file")
}

return f, nil
}

func sysExit(errCode int) {
terminal.DisableRawMode()
os.Exit(errCode)
bDesc.system.Stdout = io.Discard
}

// Provide your own system description.
Expand Down
1 change: 1 addition & 0 deletions main.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import (
"os"
"time"

_ "github.com/dece2183/hexowl/builtin/default_system"
"github.com/dece2183/hexowl/input"
"github.com/dece2183/hexowl/input/syntax"
"github.com/dece2183/hexowl/input/terminal"
Expand Down

0 comments on commit cabf01b

Please sign in to comment.