package iam import ( "context" "atlas9.dev/c/core" ) type Principal interface { PrincipalID() core.ID } func Anonymous() Principal { return anonymous{} } type anonymous struct{} func (anonymous) PrincipalID() core.ID { return core.ID{} } type principalContextKey struct{} // GetPrincipal retrieves a Principal from the context. // If not found, returns a zero value (anonymous) principal. func GetPrincipal(ctx context.Context) Principal { if op, ok := ctx.Value(principalContextKey{}).(Principal); ok { return op } return Anonymous() } // PutPrincipal stores a Principal in the context. func PutPrincipal(ctx context.Context, op Principal) context.Context { return context.WithValue(ctx, principalContextKey{}, op) }