initial commit
This commit is contained in:
		
							
								
								
									
										113
									
								
								utils.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										113
									
								
								utils.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,113 @@ | ||||
| package niri | ||||
|  | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"context" | ||||
| 	"encoding/json" | ||||
| 	"errors" | ||||
| 	"io" | ||||
| 	"net" | ||||
| 	"os" | ||||
| ) | ||||
|  | ||||
| func notNull(c *Client) bool { | ||||
| 	return c != nil | ||||
| } | ||||
|  | ||||
| func parseEntryAsClient(entry os.DirEntry) *Client { | ||||
| 	if entry.IsDir() { | ||||
| 		return nil | ||||
| 	} | ||||
|  | ||||
| 	client, err := GetClientBySocketPath(entry.Name()) | ||||
| 	if err != nil { | ||||
| 		return nil | ||||
| 	} | ||||
|  | ||||
| 	return client | ||||
| } | ||||
|  | ||||
| func readSocket[T any](socket string, body io.Reader) Response[T] { | ||||
| 	r, err := readSocketRaw(socket, body) | ||||
| 	if err != nil { | ||||
| 		return errResponse[T](err) | ||||
| 	} | ||||
| 	defer r.Close() | ||||
|  | ||||
| 	value := new(Response[T]) | ||||
| 	if err := json.NewDecoder(r).Decode(value); err != nil { | ||||
| 		return errResponse[T](err) | ||||
| 	} | ||||
| 	return *value | ||||
| } | ||||
|  | ||||
| func subscribeSocket[T any](ctx context.Context, socket string, body io.Reader) (<-chan T, error) { | ||||
| 	ch, err := readSocketGeneric[T](ctx, socket, body) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
|  | ||||
| 	out := make(chan T, 10) | ||||
|  | ||||
| 	go func() { | ||||
| 		defer close(out) | ||||
|  | ||||
| 		for { | ||||
| 			select { | ||||
| 			case event := <-ch: | ||||
| 				out <- event | ||||
| 			case <-ctx.Done(): | ||||
| 				return | ||||
| 			} | ||||
| 		} | ||||
| 	}() | ||||
|  | ||||
| 	return out, nil | ||||
| } | ||||
|  | ||||
| func readSocketGeneric[T any](ctx context.Context, socket string, body io.Reader) (<-chan T, error) { | ||||
| 	r, err := readSocketRaw(socket, body) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
|  | ||||
| 	out := make(chan T, 10) | ||||
|  | ||||
| 	go func() { | ||||
| 		defer close(out) | ||||
| 		defer r.Close() | ||||
|  | ||||
| 		for ctx.Err() == nil { | ||||
| 			value := new(T) | ||||
| 			if err := json.NewDecoder(r).Decode(value); err != nil { | ||||
| 				if errors.Is(err, io.EOF) { | ||||
| 					return | ||||
| 				} else { | ||||
| 					continue | ||||
| 				} | ||||
| 			} | ||||
| 			out <- *value | ||||
| 		} | ||||
| 	}() | ||||
|  | ||||
| 	return out, nil | ||||
| } | ||||
|  | ||||
| func readSocketRaw(socket string, body io.Reader) (io.ReadCloser, error) { | ||||
| 	conn, err := net.Dial("unix", socket) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
|  | ||||
| 	if _, err := io.Copy(conn, body); err != nil { | ||||
| 		conn.Close() | ||||
| 		return nil, err | ||||
| 	} | ||||
|  | ||||
| 	return conn, nil | ||||
| } | ||||
|  | ||||
| func asJsonReader(v any) io.Reader { | ||||
| 	data, _ := json.Marshal(v) | ||||
| 	return bytes.NewReader(append(data, '\n')) | ||||
| } | ||||
		Reference in New Issue
	
	Block a user