package types

import (
	
	
	

	amhelp 
	am 
)

func init() {
	gob.Register(&ARpc{})
}

// ///// ///// /////

// ///// ARGS

// ///// ///// /////
// TODO add RPC args example from pkg/node

const APrefix = "daemon"

// A is a struct for node arguments. It's a typesafe alternative to [am.A].
type A struct {
	Duration time.Duration `log:"duration"`
}

// ARpc is a subset of A, that can be passed over RPC.
type ARpc struct {
	Duration time.Duration `log:"duration"`
}

// ParseArgs extracts A from [am.Event.Args][APrefix].
func ( am.A) *A {
	if ,  := [APrefix].(*ARpc);  {
		return amhelp.ArgsToArgs(, &A{})
	} else if ,  := [APrefix].(ARpc);  {
		return amhelp.ArgsToArgs(&, &A{})
	}
	if ,  := [APrefix].(*A);  != nil {
		return 
	}

	return &A{}
}

// Pass prepares [am.A] from A to pass to further mutations.
func ( *A) am.A {
	return am.A{APrefix: }
}

// PassRpc prepares [am.A] from A to pass over RPC.
func ( *ARpc) am.A {
	return am.A{APrefix: amhelp.ArgsToArgs(, &ARpc{})}
}

// LogArgs is an args logger for A.
func ( am.A) map[string]string {
	 := ParseArgs()
	if  == nil {
		return nil
	}

	return amhelp.ArgsToLogMap(, 0)
}

// ParseRpc parses am.A to *ARpc wrapped in am.A. Useful for REPLs.
func ( am.A) am.A {
	 := am.A{APrefix: &ARpc{}}
	,  := json.Marshal()
	if  == nil {
		json.Unmarshal(, [APrefix])
	}

	return 
}