assert.gno

package access

import "gno.land/p/onbloc/access/manager"

func assertIsRlmCurrent(_ int, rlm realm) {
	if !rlm.IsCurrent() {
		panic(ErrSpoofedRealm)
	}
}

// AssertCanCall panics unless caller can call selector on the calling realm's target path.
// Union reference:
// https://github.com/unionlabs/union/blob/8cff0ff34f6baa4cdb1e4650a08985dd05de0c5a/cosmwasm/access-managed/src/restricted.rs#L38-L66
func AssertCanCall(_ int, rlm realm, selector manager.Selector) {
	assertIsRlmCurrent(0, rlm)

	caller := rlm.Previous().Address()
	target := rlm.PkgPath()
	if !accessState.IsAuthorized(caller, target, selector) {
		panic(AccessManagerUnauthorizedCallError(caller, target, selector))
	}
}

func assertCanManageTarget(_ int, rlm realm) {
	caller := rlm.Previous().Address()
	if !accessState.CanManageTarget(caller).Immediate {
		panic(AccessManagerUnauthorizedAccountError(caller, manager.AdminRole))
	}
}

func assertCanAdminRole(_ int, rlm realm, role manager.RoleId) {
	caller := rlm.Previous().Address()
	if !accessState.CanAdminRole(role, caller).Immediate {
		panic(AccessManagerUnauthorizedAccountError(caller, accessState.GetRoleAdmin(role)))
	}
}