/// Helper class to generate role strings for `Permission`.
public class Role {

    /// Grants access to anyone.
    /// 
    /// This includes authenticated and unauthenticated users.
    public static func any() -> String {
        return "any"
    }

    /// Grants access to a specific user by user ID.
    /// 
    /// You can optionally pass verified or unverified for
    /// `status` to target specific types of users.
    ///
    /// @param String id
    /// @param String status
    /// @return String
    public static func user(_ id: String, _ status: String = "") -> String {
        if(status.isEmpty) {
            return "user:\(id)"
        }
        return "user:\(id)/\(status)"
    }

    /// Grants access to any authenticated or anonymous user.
    /// 
    /// You can optionally pass verified or unverified for
    /// `status` to target specific types of users.
    ///
    /// @param String status
    /// @return String
    public static func users(_ status: String = "") -> String {
        if(status.isEmpty) {
            return "users"
        }
        return "users/\(status)"
    }

    /// Grants access to any guest user without a session.
    /// 
    /// Authenticated users don't have access to this role.
    ///
    /// @return String
    public static func guests() -> String {
        return "guests"
    }

    /// Grants access to a team by team ID.
    /// 
    /// You can optionally pass a role for `role` to target
    /// team members with the specified role.
    ///
    /// @param String id
    /// @param String role
    /// @return String
    public static func team(_ id: String, _ role: String = "") -> String {
        if(role.isEmpty) {
            return "team:\(id)"
        }
        return "team:\(id)/\(role)"
    }

    /// Grants access to a specific member of a team.
    /// 
    /// When the member is removed from the team, they will
    /// no longer have access.
    ///
    /// @param String id
    /// @return String
    public static func member(_ id: String) -> String {
        return "member:\(id)"
    }

    /// Grants access to a user with the specified label.
    ///
    /// @param String name
    /// @return String
    public static func label(_ name: String) -> String {
        return "label:\(name)"
    }
}