aboutsummaryrefslogtreecommitdiffhomepage
path: root/hst/enablement.go
blob: 021288b3538227624ebfed39287b5d8a6d3687df (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
package hst

import (
	"encoding/json"
	"syscall"

	"hakurei.app/system"
)

// NewEnablements returns the address of [system.Enablement] as [Enablements].
func NewEnablements(e system.Enablement) *Enablements { return (*Enablements)(&e) }

// enablementsJSON is the [json] representation of the [system.Enablement] bit field.
type enablementsJSON struct {
	Wayland bool `json:"wayland,omitempty"`
	X11     bool `json:"x11,omitempty"`
	DBus    bool `json:"dbus,omitempty"`
	Pulse   bool `json:"pulse,omitempty"`
}

// Enablements is the [json] adapter for [system.Enablement].
type Enablements system.Enablement

// Unwrap returns the underlying [system.Enablement].
func (e *Enablements) Unwrap() system.Enablement {
	if e == nil {
		return 0
	}
	return system.Enablement(*e)
}

func (e *Enablements) MarshalJSON() ([]byte, error) {
	if e == nil {
		return nil, syscall.EINVAL
	}
	return json.Marshal(&enablementsJSON{
		Wayland: system.Enablement(*e)&system.EWayland != 0,
		X11:     system.Enablement(*e)&system.EX11 != 0,
		DBus:    system.Enablement(*e)&system.EDBus != 0,
		Pulse:   system.Enablement(*e)&system.EPulse != 0,
	})
}

func (e *Enablements) UnmarshalJSON(data []byte) error {
	if e == nil {
		return syscall.EINVAL
	}

	v := new(enablementsJSON)
	if err := json.Unmarshal(data, &v); err != nil {
		return err
	}

	var ve system.Enablement
	if v.Wayland {
		ve |= system.EWayland
	}
	if v.X11 {
		ve |= system.EX11
	}
	if v.DBus {
		ve |= system.EDBus
	}
	if v.Pulse {
		ve |= system.EPulse
	}
	*e = Enablements(ve)
	return nil
}