File size: 1,363 Bytes
857a91b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
package controlplane

import (
	"fmt"
	"os"
	"path/filepath"
	"strings"
)

// JoinConfig is persisted to ~/.matrix/runtime/config.yaml by the join command.
type JoinConfig struct {
	CloudURL  string
	JoinToken string
	RuntimeID string
	Workspace string
}

// ConfigPath returns the on-disk join config path under the user's home.
func ConfigPath() (string, error) {
	home, err := os.UserHomeDir()
	if err != nil {
		return "", err
	}
	return filepath.Join(home, ".matrix", "runtime", "config.yaml"), nil
}

// WriteJoinConfig writes the join configuration as YAML. A minimal hand-rolled
// encoder is used to avoid a YAML dependency in the MVP.
func WriteJoinConfig(cfg JoinConfig) (string, error) {
	if cfg.CloudURL == "" || cfg.JoinToken == "" {
		return "", fmt.Errorf("cloud url and join token are required")
	}
	path, err := ConfigPath()
	if err != nil {
		return "", err
	}
	if err := os.MkdirAll(filepath.Dir(path), 0o700); err != nil {
		return "", err
	}
	var b strings.Builder
	fmt.Fprintf(&b, "cloud_url: %s\n", cfg.CloudURL)
	fmt.Fprintf(&b, "join_token: %s\n", cfg.JoinToken)
	if cfg.RuntimeID != "" {
		fmt.Fprintf(&b, "runtime_id: %s\n", cfg.RuntimeID)
	}
	if cfg.Workspace != "" {
		fmt.Fprintf(&b, "workspace: %s\n", cfg.Workspace)
	}
	if err := os.WriteFile(path, []byte(b.String()), 0o600); err != nil {
		return "", err
	}
	return path, nil
}