It appears to pass all tests, but I’m not sure if my test writing skills are necessarily that great, I semi-followed the learn go with tests eBook. I appreciate any feedback, and if this isn’t an appropriate post for this community just let me know and I’ll remove.

Thanks!!

*** Update *** Updated the repository to be a bit more discriptive of what the library is for and added in a small example project of it in action.

  • xtapa
    link
    fedilink
    arrow-up
    2
    ·
    edit-2
    1 day ago

    I personally try to avoid deeply nested if/else. Or else in general, because I think it makes code more readable. Especially when one of the branches is just an exit condition.

    if exitCondition {
        return false
    }
    // long ass code execution
    

    is way more readable than

    if !exitCondition {
        // long ass code execution
    } else {
       return false
    }
    

    In a loop, you can just return the value instead of passing it to a “retVal” variable.

    With those in mind, you could refactor HasPermissions to

    func (r *RBAC) HasPermission(assignedRoles []string, requiredPermission string, visited map[string]bool) bool {
    	for _, assigned := range assignedRoles {
    		if visited[assigned] {
    			continue
    		}
    		role, ok := r.Roles[assigned]
    		if !ok {
    			//role does not exist, so skip it
    			continue
    		}
    		for _, permission := range role.Permissions {
    			if permission.String() == requiredPermission {
    				//Permission has been found! Set permitted to true and bust out of the loop
    				return true
    			}
    		}
    		//check inherited roles
    		if permitted := r.HasPermission(role.Inherits, requiredPermission, visited); permitted {
    			return true
    		}
    	}
    	return false
    }
    

    The same could be applied to LoadJSONFile and I think that really would approve the readability and maintainability of your code.

    edit: This refactor is not tested