github.com/google/go-github/v70@v70.0.0/github/rules.go (about)

     1  // Copyright 2025 The go-github AUTHORS. All rights reserved.
     2  //
     3  // Use of this source code is governed by a BSD-style
     4  // license that can be found in the LICENSE file.
     5  
     6  package github
     7  
     8  import (
     9  	"encoding/json"
    10  	"reflect"
    11  )
    12  
    13  // RulesetTarget represents a GitHub ruleset target.
    14  type RulesetTarget string
    15  
    16  // This is the set of GitHub ruleset targets.
    17  const (
    18  	RulesetTargetBranch RulesetTarget = "branch"
    19  	RulesetTargetTag    RulesetTarget = "tag"
    20  	RulesetTargetPush   RulesetTarget = "push"
    21  )
    22  
    23  // RulesetSourceType represents a GitHub ruleset source type.
    24  type RulesetSourceType string
    25  
    26  // This is the set of GitHub ruleset source types.
    27  const (
    28  	RulesetSourceTypeRepository   RulesetSourceType = "Repository"
    29  	RulesetSourceTypeOrganization RulesetSourceType = "Organization"
    30  	RulesetSourceTypeEnterprise   RulesetSourceType = "Enterprise"
    31  )
    32  
    33  // RulesetEnforcement represents a GitHub ruleset enforcement.
    34  type RulesetEnforcement string
    35  
    36  // This is the set of GitHub ruleset enforcements.
    37  const (
    38  	RulesetEnforcementDisabled RulesetEnforcement = "disabled"
    39  	RulesetEnforcementActive   RulesetEnforcement = "active"
    40  	RulesetEnforcementEvaluate RulesetEnforcement = "evaluate"
    41  )
    42  
    43  // BypassActorType represents a GitHub ruleset bypass actor type.
    44  type BypassActorType string
    45  
    46  // This is the set of GitHub ruleset bypass actor types.
    47  const (
    48  	BypassActorTypeIntegration       BypassActorType = "Integration"
    49  	BypassActorTypeOrganizationAdmin BypassActorType = "OrganizationAdmin"
    50  	BypassActorTypeRepositoryRole    BypassActorType = "RepositoryRole"
    51  	BypassActorTypeTeam              BypassActorType = "Team"
    52  	BypassActorTypeDeployKey         BypassActorType = "DeployKey"
    53  )
    54  
    55  // BypassMode represents a GitHub ruleset bypass mode.
    56  type BypassMode string
    57  
    58  // This is the set of GitHub ruleset bypass modes.
    59  const (
    60  	BypassModeAlways      BypassMode = "always"
    61  	BypassModePullRequest BypassMode = "pull_request"
    62  	BypassModeNever       BypassMode = "never"
    63  )
    64  
    65  // RepositoryRuleType represents a GitHub ruleset rule type.
    66  type RepositoryRuleType string
    67  
    68  // This is the set of GitHub ruleset rule types.
    69  const (
    70  	RulesetRuleTypeCreation                 RepositoryRuleType = "creation"
    71  	RulesetRuleTypeUpdate                   RepositoryRuleType = "update"
    72  	RulesetRuleTypeDeletion                 RepositoryRuleType = "deletion"
    73  	RulesetRuleTypeRequiredLinearHistory    RepositoryRuleType = "required_linear_history"
    74  	RulesetRuleTypeMergeQueue               RepositoryRuleType = "merge_queue"
    75  	RulesetRuleTypeRequiredDeployments      RepositoryRuleType = "required_deployments"
    76  	RulesetRuleTypeRequiredSignatures       RepositoryRuleType = "required_signatures"
    77  	RulesetRuleTypePullRequest              RepositoryRuleType = "pull_request"
    78  	RulesetRuleTypeRequiredStatusChecks     RepositoryRuleType = "required_status_checks"
    79  	RulesetRuleTypeNonFastForward           RepositoryRuleType = "non_fast_forward"
    80  	RulesetRuleTypeCommitMessagePattern     RepositoryRuleType = "commit_message_pattern"
    81  	RulesetRuleTypeCommitAuthorEmailPattern RepositoryRuleType = "commit_author_email_pattern"
    82  	RulesetRuleTypeCommitterEmailPattern    RepositoryRuleType = "committer_email_pattern"
    83  	RulesetRuleTypeBranchNamePattern        RepositoryRuleType = "branch_name_pattern"
    84  	RulesetRuleTypeTagNamePattern           RepositoryRuleType = "tag_name_pattern"
    85  	RulesetRuleTypeFilePathRestriction      RepositoryRuleType = "file_path_restriction"
    86  	RulesetRuleTypeMaxFilePathLength        RepositoryRuleType = "max_file_path_length"
    87  	RulesetRuleTypeFileExtensionRestriction RepositoryRuleType = "file_extension_restriction"
    88  	RulesetRuleTypeMaxFileSize              RepositoryRuleType = "max_file_size"
    89  	RulesetRuleTypeWorkflows                RepositoryRuleType = "workflows"
    90  	RulesetRuleTypeCodeScanning             RepositoryRuleType = "code_scanning"
    91  )
    92  
    93  // MergeGroupingStrategy models a GitHub merge grouping strategy.
    94  type MergeGroupingStrategy string
    95  
    96  // This is the set of GitHub merge grouping strategies.
    97  const (
    98  	MergeGroupingStrategyAllGreen  MergeGroupingStrategy = "ALLGREEN"
    99  	MergeGroupingStrategyHeadGreen MergeGroupingStrategy = "HEADGREEN"
   100  )
   101  
   102  // MergeMethod models a GitHub merge method.
   103  type MergeMethod string
   104  
   105  // This is the set of GitHub merge methods.
   106  const (
   107  	MergeMethodMerge  MergeMethod = "merge"
   108  	MergeMethodRebase MergeMethod = "rebase"
   109  	MergeMethodSquash MergeMethod = "squash"
   110  )
   111  
   112  // PatternRuleOperator models a GitHub pattern rule operator.
   113  type PatternRuleOperator string
   114  
   115  // This is the set of GitHub pattern rule operators.
   116  const (
   117  	PatternRuleOperatorStartsWith PatternRuleOperator = "starts_with"
   118  	PatternRuleOperatorEndsWith   PatternRuleOperator = "ends_with"
   119  	PatternRuleOperatorContains   PatternRuleOperator = "contains"
   120  	PatternRuleOperatorRegex      PatternRuleOperator = "regex"
   121  )
   122  
   123  // CodeScanningAlertsThreshold models a GitHub code scanning alerts threshold.
   124  type CodeScanningAlertsThreshold string
   125  
   126  // This is the set of GitHub code scanning alerts thresholds.
   127  const (
   128  	CodeScanningAlertsThresholdNone              CodeScanningAlertsThreshold = "none"
   129  	CodeScanningAlertsThresholdErrors            CodeScanningAlertsThreshold = "errors"
   130  	CodeScanningAlertsThresholdErrorsAndWarnings CodeScanningAlertsThreshold = "errors_and_warnings"
   131  	CodeScanningAlertsThresholdAll               CodeScanningAlertsThreshold = "all"
   132  )
   133  
   134  // CodeScanningSecurityAlertsThreshold models a GitHub code scanning security alerts threshold.
   135  type CodeScanningSecurityAlertsThreshold string
   136  
   137  // This is the set of GitHub code scanning security alerts thresholds.
   138  const (
   139  	CodeScanningSecurityAlertsThresholdNone           CodeScanningSecurityAlertsThreshold = "none"
   140  	CodeScanningSecurityAlertsThresholdCritical       CodeScanningSecurityAlertsThreshold = "critical"
   141  	CodeScanningSecurityAlertsThresholdHighOrHigher   CodeScanningSecurityAlertsThreshold = "high_or_higher"
   142  	CodeScanningSecurityAlertsThresholdMediumOrHigher CodeScanningSecurityAlertsThreshold = "medium_or_higher"
   143  	CodeScanningSecurityAlertsThresholdAll            CodeScanningSecurityAlertsThreshold = "all"
   144  )
   145  
   146  // RepositoryRuleset represents a GitHub ruleset object.
   147  type RepositoryRuleset struct {
   148  	ID                   *int64                       `json:"id,omitempty"`
   149  	Name                 string                       `json:"name"`
   150  	Target               *RulesetTarget               `json:"target,omitempty"`
   151  	SourceType           *RulesetSourceType           `json:"source_type,omitempty"`
   152  	Source               string                       `json:"source"`
   153  	Enforcement          RulesetEnforcement           `json:"enforcement"`
   154  	BypassActors         []*BypassActor               `json:"bypass_actors,omitempty"`
   155  	CurrentUserCanBypass *BypassMode                  `json:"current_user_can_bypass,omitempty"`
   156  	NodeID               *string                      `json:"node_id,omitempty"`
   157  	Links                *RepositoryRulesetLinks      `json:"_links,omitempty"`
   158  	Conditions           *RepositoryRulesetConditions `json:"conditions,omitempty"`
   159  	Rules                *RepositoryRulesetRules      `json:"rules,omitempty"`
   160  	UpdatedAt            *Timestamp                   `json:"updated_at,omitempty"`
   161  	CreatedAt            *Timestamp                   `json:"created_at,omitempty"`
   162  }
   163  
   164  // BypassActor represents the bypass actors from a ruleset.
   165  type BypassActor struct {
   166  	ActorID    *int64           `json:"actor_id,omitempty"`
   167  	ActorType  *BypassActorType `json:"actor_type,omitempty"`
   168  	BypassMode *BypassMode      `json:"bypass_mode,omitempty"`
   169  }
   170  
   171  // RepositoryRulesetLinks represents the "_links" object in a Ruleset.
   172  type RepositoryRulesetLinks struct {
   173  	Self *RepositoryRulesetLink `json:"self,omitempty"`
   174  	HTML *RepositoryRulesetLink `json:"html,omitempty"`
   175  }
   176  
   177  // RepositoryRulesetLink represents a single link object from GitHub ruleset request _links.
   178  type RepositoryRulesetLink struct {
   179  	HRef *string `json:"href,omitempty"`
   180  }
   181  
   182  // RepositoryRulesetConditions represents the conditions object in a ruleset.
   183  // Set either RepositoryName or RepositoryID or RepositoryProperty, not more than one.
   184  type RepositoryRulesetConditions struct {
   185  	RefName            *RepositoryRulesetRefConditionParameters                `json:"ref_name,omitempty"`
   186  	RepositoryID       *RepositoryRulesetRepositoryIDsConditionParameters      `json:"repository_id,omitempty"`
   187  	RepositoryName     *RepositoryRulesetRepositoryNamesConditionParameters    `json:"repository_name,omitempty"`
   188  	RepositoryProperty *RepositoryRulesetRepositoryPropertyConditionParameters `json:"repository_property,omitempty"`
   189  	OrganizationID     *RepositoryRulesetOrganizationIDsConditionParameters    `json:"organization_id,omitempty"`
   190  	OrganizationName   *RepositoryRulesetOrganizationNamesConditionParameters  `json:"organization_name,omitempty"`
   191  }
   192  
   193  // RepositoryRulesetRefConditionParameters represents the conditions object for ref_names.
   194  type RepositoryRulesetRefConditionParameters struct {
   195  	Include []string `json:"include"`
   196  	Exclude []string `json:"exclude"`
   197  }
   198  
   199  // RepositoryRulesetRepositoryIDsConditionParameters represents the conditions object for repository_id.
   200  type RepositoryRulesetRepositoryIDsConditionParameters struct {
   201  	RepositoryIDs []int64 `json:"repository_ids,omitempty"`
   202  }
   203  
   204  // RepositoryRulesetRepositoryNamesConditionParameters represents the conditions object for repository_name.
   205  type RepositoryRulesetRepositoryNamesConditionParameters struct {
   206  	Include   []string `json:"include"`
   207  	Exclude   []string `json:"exclude"`
   208  	Protected *bool    `json:"protected,omitempty"`
   209  }
   210  
   211  // RepositoryRulesetRepositoryPropertyConditionParameters represents the conditions object for repository_property.
   212  type RepositoryRulesetRepositoryPropertyConditionParameters struct {
   213  	Include []*RepositoryRulesetRepositoryPropertyTargetParameters `json:"include"`
   214  	Exclude []*RepositoryRulesetRepositoryPropertyTargetParameters `json:"exclude"`
   215  }
   216  
   217  // RepositoryRulesetRepositoryPropertyTargetParameters represents a repository_property name and values to be used for targeting.
   218  type RepositoryRulesetRepositoryPropertyTargetParameters struct {
   219  	Name           string   `json:"name"`
   220  	PropertyValues []string `json:"property_values"`
   221  	Source         *string  `json:"source,omitempty"`
   222  }
   223  
   224  // RepositoryRulesetOrganizationIDsConditionParameters represents the conditions object for organization_id.
   225  type RepositoryRulesetOrganizationIDsConditionParameters struct {
   226  	OrganizationIDs []int64 `json:"organization_ids,omitempty"`
   227  }
   228  
   229  // RepositoryRulesetOrganizationNamesConditionParameters represents the conditions object for organization_name.
   230  type RepositoryRulesetOrganizationNamesConditionParameters struct {
   231  	Include []string `json:"include"`
   232  	Exclude []string `json:"exclude"`
   233  }
   234  
   235  // RepositoryRule represents a GitHub ruleset rule object.
   236  type RepositoryRule struct {
   237  	Type       RepositoryRuleType `json:"type"`
   238  	Parameters any                `json:"parameters,omitempty"`
   239  }
   240  
   241  // RepositoryRulesetRules represents a GitHub ruleset rules object.
   242  // This type doesn't have JSON annotations as it uses custom marshaling.
   243  type RepositoryRulesetRules struct {
   244  	Creation                 *EmptyRuleParameters
   245  	Update                   *UpdateRuleParameters
   246  	Deletion                 *EmptyRuleParameters
   247  	RequiredLinearHistory    *EmptyRuleParameters
   248  	MergeQueue               *MergeQueueRuleParameters
   249  	RequiredDeployments      *RequiredDeploymentsRuleParameters
   250  	RequiredSignatures       *EmptyRuleParameters
   251  	PullRequest              *PullRequestRuleParameters
   252  	RequiredStatusChecks     *RequiredStatusChecksRuleParameters
   253  	NonFastForward           *EmptyRuleParameters
   254  	CommitMessagePattern     *PatternRuleParameters
   255  	CommitAuthorEmailPattern *PatternRuleParameters
   256  	CommitterEmailPattern    *PatternRuleParameters
   257  	BranchNamePattern        *PatternRuleParameters
   258  	TagNamePattern           *PatternRuleParameters
   259  	FilePathRestriction      *FilePathRestrictionRuleParameters
   260  	MaxFilePathLength        *MaxFilePathLengthRuleParameters
   261  	FileExtensionRestriction *FileExtensionRestrictionRuleParameters
   262  	MaxFileSize              *MaxFileSizeRuleParameters
   263  	Workflows                *WorkflowsRuleParameters
   264  	CodeScanning             *CodeScanningRuleParameters
   265  }
   266  
   267  // BranchRules represents the rules active for a GitHub repository branch.
   268  // This type doesn't have JSON annotations as it uses custom marshaling.
   269  type BranchRules struct {
   270  	Creation                 []*BranchRuleMetadata
   271  	Update                   []*UpdateBranchRule
   272  	Deletion                 []*BranchRuleMetadata
   273  	RequiredLinearHistory    []*BranchRuleMetadata
   274  	MergeQueue               []*MergeQueueBranchRule
   275  	RequiredDeployments      []*RequiredDeploymentsBranchRule
   276  	RequiredSignatures       []*BranchRuleMetadata
   277  	PullRequest              []*PullRequestBranchRule
   278  	RequiredStatusChecks     []*RequiredStatusChecksBranchRule
   279  	NonFastForward           []*BranchRuleMetadata
   280  	CommitMessagePattern     []*PatternBranchRule
   281  	CommitAuthorEmailPattern []*PatternBranchRule
   282  	CommitterEmailPattern    []*PatternBranchRule
   283  	BranchNamePattern        []*PatternBranchRule
   284  	TagNamePattern           []*PatternBranchRule
   285  	FilePathRestriction      []*FilePathRestrictionBranchRule
   286  	MaxFilePathLength        []*MaxFilePathLengthBranchRule
   287  	FileExtensionRestriction []*FileExtensionRestrictionBranchRule
   288  	MaxFileSize              []*MaxFileSizeBranchRule
   289  	Workflows                []*WorkflowsBranchRule
   290  	CodeScanning             []*CodeScanningBranchRule
   291  }
   292  
   293  // BranchRuleMetadata represents the metadata for a branch rule.
   294  type BranchRuleMetadata struct {
   295  	RulesetSourceType RulesetSourceType `json:"ruleset_source_type"`
   296  	RulesetSource     string            `json:"ruleset_source"`
   297  	RulesetID         int64             `json:"ruleset_id"`
   298  }
   299  
   300  // UpdateBranchRule represents an update branch rule.
   301  type UpdateBranchRule struct {
   302  	BranchRuleMetadata
   303  	Parameters UpdateRuleParameters `json:"parameters"`
   304  }
   305  
   306  // MergeQueueBranchRule represents a merge queue branch rule.
   307  type MergeQueueBranchRule struct {
   308  	BranchRuleMetadata
   309  	Parameters MergeQueueRuleParameters `json:"parameters"`
   310  }
   311  
   312  // RequiredDeploymentsBranchRule represents a required deployments branch rule.
   313  type RequiredDeploymentsBranchRule struct {
   314  	BranchRuleMetadata
   315  	Parameters RequiredDeploymentsRuleParameters `json:"parameters"`
   316  }
   317  
   318  // PullRequestBranchRule represents a pull request branch rule.
   319  type PullRequestBranchRule struct {
   320  	BranchRuleMetadata
   321  	Parameters PullRequestRuleParameters `json:"parameters"`
   322  }
   323  
   324  // RequiredStatusChecksBranchRule represents a required status checks branch rule.
   325  type RequiredStatusChecksBranchRule struct {
   326  	BranchRuleMetadata
   327  	Parameters RequiredStatusChecksRuleParameters `json:"parameters"`
   328  }
   329  
   330  // PatternBranchRule represents a pattern branch rule.
   331  type PatternBranchRule struct {
   332  	BranchRuleMetadata
   333  	Parameters PatternRuleParameters `json:"parameters"`
   334  }
   335  
   336  // FilePathRestrictionBranchRule represents a file path restriction branch rule.
   337  type FilePathRestrictionBranchRule struct {
   338  	BranchRuleMetadata
   339  	Parameters FilePathRestrictionRuleParameters `json:"parameters"`
   340  }
   341  
   342  // MaxFilePathLengthBranchRule represents a max file path length branch rule.
   343  type MaxFilePathLengthBranchRule struct {
   344  	BranchRuleMetadata
   345  	Parameters MaxFilePathLengthRuleParameters `json:"parameters"`
   346  }
   347  
   348  // FileExtensionRestrictionBranchRule represents a file extension restriction branch rule.
   349  type FileExtensionRestrictionBranchRule struct {
   350  	BranchRuleMetadata
   351  	Parameters FileExtensionRestrictionRuleParameters `json:"parameters"`
   352  }
   353  
   354  // MaxFileSizeBranchRule represents a max file size branch rule.
   355  type MaxFileSizeBranchRule struct {
   356  	BranchRuleMetadata
   357  	Parameters MaxFileSizeRuleParameters `json:"parameters"`
   358  }
   359  
   360  // WorkflowsBranchRule represents a workflows branch rule.
   361  type WorkflowsBranchRule struct {
   362  	BranchRuleMetadata
   363  	Parameters WorkflowsRuleParameters `json:"parameters"`
   364  }
   365  
   366  // CodeScanningBranchRule represents a code scanning branch rule.
   367  type CodeScanningBranchRule struct {
   368  	BranchRuleMetadata
   369  	Parameters CodeScanningRuleParameters `json:"parameters"`
   370  }
   371  
   372  // EmptyRuleParameters represents the parameters for a rule with no options.
   373  type EmptyRuleParameters struct{}
   374  
   375  // UpdateRuleParameters represents the update rule parameters.
   376  type UpdateRuleParameters struct {
   377  	UpdateAllowsFetchAndMerge bool `json:"update_allows_fetch_and_merge,omitempty"`
   378  }
   379  
   380  // MergeQueueRuleParameters represents the merge_queue rule parameters.
   381  type MergeQueueRuleParameters struct {
   382  	CheckResponseTimeoutMinutes  int                   `json:"check_response_timeout_minutes"`
   383  	GroupingStrategy             MergeGroupingStrategy `json:"grouping_strategy"`
   384  	MaxEntriesToBuild            int                   `json:"max_entries_to_build"`
   385  	MaxEntriesToMerge            int                   `json:"max_entries_to_merge"`
   386  	MergeMethod                  MergeMethod           `json:"merge_method"`
   387  	MinEntriesToMerge            int                   `json:"min_entries_to_merge"`
   388  	MinEntriesToMergeWaitMinutes int                   `json:"min_entries_to_merge_wait_minutes"`
   389  }
   390  
   391  // RequiredDeploymentsRuleParameters represents the required deployments rule parameters.
   392  type RequiredDeploymentsRuleParameters struct {
   393  	RequiredDeploymentEnvironments []string `json:"required_deployment_environments"`
   394  }
   395  
   396  // PullRequestRuleParameters represents the pull_request rule parameters.
   397  type PullRequestRuleParameters struct {
   398  	AllowedMergeMethods               []MergeMethod `json:"allowed_merge_methods"`
   399  	AutomaticCopilotCodeReviewEnabled *bool         `json:"automatic_copilot_code_review_enabled,omitempty"`
   400  	DismissStaleReviewsOnPush         bool          `json:"dismiss_stale_reviews_on_push"`
   401  	RequireCodeOwnerReview            bool          `json:"require_code_owner_review"`
   402  	RequireLastPushApproval           bool          `json:"require_last_push_approval"`
   403  	RequiredApprovingReviewCount      int           `json:"required_approving_review_count"`
   404  	RequiredReviewThreadResolution    bool          `json:"required_review_thread_resolution"`
   405  }
   406  
   407  // RequiredStatusChecksRuleParameters represents the required status checks rule parameters.
   408  type RequiredStatusChecksRuleParameters struct {
   409  	DoNotEnforceOnCreate             *bool              `json:"do_not_enforce_on_create,omitempty"`
   410  	RequiredStatusChecks             []*RuleStatusCheck `json:"required_status_checks"`
   411  	StrictRequiredStatusChecksPolicy bool               `json:"strict_required_status_checks_policy"`
   412  }
   413  
   414  // RuleStatusCheck represents a status checks for the required status checks rule parameters.
   415  type RuleStatusCheck struct {
   416  	Context       string `json:"context"`
   417  	IntegrationID *int64 `json:"integration_id,omitempty"`
   418  }
   419  
   420  // PatternRuleParameters represents the parameters for a pattern rule.
   421  type PatternRuleParameters struct {
   422  	Name *string `json:"name,omitempty"`
   423  	// If Negate is true, the rule will fail if the pattern matches.
   424  	Negate   *bool               `json:"negate,omitempty"`
   425  	Operator PatternRuleOperator `json:"operator"`
   426  	Pattern  string              `json:"pattern"`
   427  }
   428  
   429  // FilePathRestrictionRuleParameters represents the file path restriction rule parameters.
   430  type FilePathRestrictionRuleParameters struct {
   431  	RestrictedFilePaths []string `json:"restricted_file_paths"`
   432  }
   433  
   434  // MaxFilePathLengthRuleParameters represents the max file path length rule parameters.
   435  type MaxFilePathLengthRuleParameters struct {
   436  	MaxFilePathLength int `json:"max_file_path_length"`
   437  }
   438  
   439  // FileExtensionRestrictionRuleParameters represents the file extension restriction rule parameters.
   440  type FileExtensionRestrictionRuleParameters struct {
   441  	RestrictedFileExtensions []string `json:"restricted_file_extensions"`
   442  }
   443  
   444  // MaxFileSizeRuleParameters represents the max file size rule parameters.
   445  type MaxFileSizeRuleParameters struct {
   446  	MaxFileSize int64 `json:"max_file_size"`
   447  }
   448  
   449  // WorkflowsRuleParameters represents the workflows rule parameters.
   450  type WorkflowsRuleParameters struct {
   451  	DoNotEnforceOnCreate *bool           `json:"do_not_enforce_on_create,omitempty"`
   452  	Workflows            []*RuleWorkflow `json:"workflows"`
   453  }
   454  
   455  // RuleWorkflow represents a Workflow for the workflows rule parameters.
   456  type RuleWorkflow struct {
   457  	Path         string  `json:"path"`
   458  	Ref          *string `json:"ref,omitempty"`
   459  	RepositoryID *int64  `json:"repository_id,omitempty"`
   460  	SHA          *string `json:"sha,omitempty"`
   461  }
   462  
   463  // CodeScanningRuleParameters represents the code scanning rule parameters.
   464  type CodeScanningRuleParameters struct {
   465  	CodeScanningTools []*RuleCodeScanningTool `json:"code_scanning_tools"`
   466  }
   467  
   468  // RuleCodeScanningTool represents a single code scanning tool for the code scanning parameters.
   469  type RuleCodeScanningTool struct {
   470  	AlertsThreshold         CodeScanningAlertsThreshold         `json:"alerts_threshold"`
   471  	SecurityAlertsThreshold CodeScanningSecurityAlertsThreshold `json:"security_alerts_threshold"`
   472  	Tool                    string                              `json:"tool"`
   473  }
   474  
   475  // repositoryRulesetRuleWrapper is a helper type to marshal & unmarshal a ruleset rule.
   476  type repositoryRulesetRuleWrapper struct {
   477  	Type       RepositoryRuleType `json:"type"`
   478  	Parameters json.RawMessage    `json:"parameters,omitempty"`
   479  }
   480  
   481  // MarshalJSON is a custom JSON marshaler for RulesetRules.
   482  func (r *RepositoryRulesetRules) MarshalJSON() ([]byte, error) {
   483  	// The RepositoryRulesetRules type marshals to between 1 and 21 rules.
   484  	// If new rules are added to RepositoryRulesetRules the capacity below needs increasing
   485  	rawRules := make([]json.RawMessage, 0, 21)
   486  
   487  	if r.Creation != nil {
   488  		bytes, err := marshalRepositoryRulesetRule(RulesetRuleTypeCreation, r.Creation)
   489  		if err != nil {
   490  			return nil, err
   491  		}
   492  		rawRules = append(rawRules, json.RawMessage(bytes))
   493  	}
   494  
   495  	if r.Update != nil {
   496  		bytes, err := marshalRepositoryRulesetRule(RulesetRuleTypeUpdate, r.Update)
   497  		if err != nil {
   498  			return nil, err
   499  		}
   500  		rawRules = append(rawRules, json.RawMessage(bytes))
   501  	}
   502  
   503  	if r.Deletion != nil {
   504  		bytes, err := marshalRepositoryRulesetRule(RulesetRuleTypeDeletion, r.Deletion)
   505  		if err != nil {
   506  			return nil, err
   507  		}
   508  		rawRules = append(rawRules, json.RawMessage(bytes))
   509  	}
   510  
   511  	if r.RequiredLinearHistory != nil {
   512  		bytes, err := marshalRepositoryRulesetRule(RulesetRuleTypeRequiredLinearHistory, r.RequiredLinearHistory)
   513  		if err != nil {
   514  			return nil, err
   515  		}
   516  		rawRules = append(rawRules, json.RawMessage(bytes))
   517  	}
   518  
   519  	if r.MergeQueue != nil {
   520  		bytes, err := marshalRepositoryRulesetRule(RulesetRuleTypeMergeQueue, r.MergeQueue)
   521  		if err != nil {
   522  			return nil, err
   523  		}
   524  		rawRules = append(rawRules, json.RawMessage(bytes))
   525  	}
   526  
   527  	if r.RequiredDeployments != nil {
   528  		bytes, err := marshalRepositoryRulesetRule(RulesetRuleTypeRequiredDeployments, r.RequiredDeployments)
   529  		if err != nil {
   530  			return nil, err
   531  		}
   532  		rawRules = append(rawRules, json.RawMessage(bytes))
   533  	}
   534  
   535  	if r.RequiredSignatures != nil {
   536  		bytes, err := marshalRepositoryRulesetRule(RulesetRuleTypeRequiredSignatures, r.RequiredSignatures)
   537  		if err != nil {
   538  			return nil, err
   539  		}
   540  		rawRules = append(rawRules, json.RawMessage(bytes))
   541  	}
   542  
   543  	if r.PullRequest != nil {
   544  		bytes, err := marshalRepositoryRulesetRule(RulesetRuleTypePullRequest, r.PullRequest)
   545  		if err != nil {
   546  			return nil, err
   547  		}
   548  		rawRules = append(rawRules, json.RawMessage(bytes))
   549  	}
   550  
   551  	if r.RequiredStatusChecks != nil {
   552  		bytes, err := marshalRepositoryRulesetRule(RulesetRuleTypeRequiredStatusChecks, r.RequiredStatusChecks)
   553  		if err != nil {
   554  			return nil, err
   555  		}
   556  		rawRules = append(rawRules, json.RawMessage(bytes))
   557  	}
   558  
   559  	if r.NonFastForward != nil {
   560  		bytes, err := marshalRepositoryRulesetRule(RulesetRuleTypeNonFastForward, r.NonFastForward)
   561  		if err != nil {
   562  			return nil, err
   563  		}
   564  		rawRules = append(rawRules, json.RawMessage(bytes))
   565  	}
   566  
   567  	if r.CommitMessagePattern != nil {
   568  		bytes, err := marshalRepositoryRulesetRule(RulesetRuleTypeCommitMessagePattern, r.CommitMessagePattern)
   569  		if err != nil {
   570  			return nil, err
   571  		}
   572  		rawRules = append(rawRules, json.RawMessage(bytes))
   573  	}
   574  
   575  	if r.CommitAuthorEmailPattern != nil {
   576  		bytes, err := marshalRepositoryRulesetRule(RulesetRuleTypeCommitAuthorEmailPattern, r.CommitAuthorEmailPattern)
   577  		if err != nil {
   578  			return nil, err
   579  		}
   580  		rawRules = append(rawRules, json.RawMessage(bytes))
   581  	}
   582  
   583  	if r.CommitterEmailPattern != nil {
   584  		bytes, err := marshalRepositoryRulesetRule(RulesetRuleTypeCommitterEmailPattern, r.CommitterEmailPattern)
   585  		if err != nil {
   586  			return nil, err
   587  		}
   588  		rawRules = append(rawRules, json.RawMessage(bytes))
   589  	}
   590  
   591  	if r.BranchNamePattern != nil {
   592  		bytes, err := marshalRepositoryRulesetRule(RulesetRuleTypeBranchNamePattern, r.BranchNamePattern)
   593  		if err != nil {
   594  			return nil, err
   595  		}
   596  		rawRules = append(rawRules, json.RawMessage(bytes))
   597  	}
   598  
   599  	if r.TagNamePattern != nil {
   600  		bytes, err := marshalRepositoryRulesetRule(RulesetRuleTypeTagNamePattern, r.TagNamePattern)
   601  		if err != nil {
   602  			return nil, err
   603  		}
   604  		rawRules = append(rawRules, json.RawMessage(bytes))
   605  	}
   606  
   607  	if r.FilePathRestriction != nil {
   608  		bytes, err := marshalRepositoryRulesetRule(RulesetRuleTypeFilePathRestriction, r.FilePathRestriction)
   609  		if err != nil {
   610  			return nil, err
   611  		}
   612  		rawRules = append(rawRules, json.RawMessage(bytes))
   613  	}
   614  
   615  	if r.MaxFilePathLength != nil {
   616  		bytes, err := marshalRepositoryRulesetRule(RulesetRuleTypeMaxFilePathLength, r.MaxFilePathLength)
   617  		if err != nil {
   618  			return nil, err
   619  		}
   620  		rawRules = append(rawRules, json.RawMessage(bytes))
   621  	}
   622  
   623  	if r.FileExtensionRestriction != nil {
   624  		bytes, err := marshalRepositoryRulesetRule(RulesetRuleTypeFileExtensionRestriction, r.FileExtensionRestriction)
   625  		if err != nil {
   626  			return nil, err
   627  		}
   628  		rawRules = append(rawRules, json.RawMessage(bytes))
   629  	}
   630  
   631  	if r.MaxFileSize != nil {
   632  		bytes, err := marshalRepositoryRulesetRule(RulesetRuleTypeMaxFileSize, r.MaxFileSize)
   633  		if err != nil {
   634  			return nil, err
   635  		}
   636  		rawRules = append(rawRules, json.RawMessage(bytes))
   637  	}
   638  
   639  	if r.Workflows != nil {
   640  		bytes, err := marshalRepositoryRulesetRule(RulesetRuleTypeWorkflows, r.Workflows)
   641  		if err != nil {
   642  			return nil, err
   643  		}
   644  		rawRules = append(rawRules, json.RawMessage(bytes))
   645  	}
   646  
   647  	if r.CodeScanning != nil {
   648  		bytes, err := marshalRepositoryRulesetRule(RulesetRuleTypeCodeScanning, r.CodeScanning)
   649  		if err != nil {
   650  			return nil, err
   651  		}
   652  		rawRules = append(rawRules, json.RawMessage(bytes))
   653  	}
   654  
   655  	return json.Marshal(rawRules)
   656  }
   657  
   658  // marshalRepositoryRulesetRule is a helper function to marshal a ruleset rule.
   659  //
   660  // TODO: Benchmark the code that uses reflection.
   661  // TODO: Use a generator here instead of reflection if there is a significant performance hit.
   662  func marshalRepositoryRulesetRule[T any](t RepositoryRuleType, params T) ([]byte, error) {
   663  	paramsType := reflect.TypeFor[T]()
   664  
   665  	if paramsType.Kind() == reflect.Pointer && (reflect.ValueOf(params).IsNil() || reflect.ValueOf(params).Elem().IsZero()) {
   666  		return json.Marshal(repositoryRulesetRuleWrapper{Type: t})
   667  	}
   668  
   669  	bytes, err := json.Marshal(params)
   670  	if err != nil {
   671  		return nil, err
   672  	}
   673  
   674  	return json.Marshal(repositoryRulesetRuleWrapper{Type: t, Parameters: json.RawMessage(bytes)})
   675  }
   676  
   677  // UnmarshalJSON is a custom JSON unmarshaler for RulesetRules.
   678  func (r *RepositoryRulesetRules) UnmarshalJSON(data []byte) error {
   679  	var wrappers []*repositoryRulesetRuleWrapper
   680  
   681  	if err := json.Unmarshal(data, &wrappers); err != nil {
   682  		return err
   683  	}
   684  
   685  	for _, w := range wrappers {
   686  		switch w.Type {
   687  		case RulesetRuleTypeCreation:
   688  			r.Creation = &EmptyRuleParameters{}
   689  		case RulesetRuleTypeUpdate:
   690  			r.Update = &UpdateRuleParameters{}
   691  
   692  			if w.Parameters != nil {
   693  				if err := json.Unmarshal(w.Parameters, r.Update); err != nil {
   694  					return err
   695  				}
   696  			}
   697  		case RulesetRuleTypeDeletion:
   698  			r.Deletion = &EmptyRuleParameters{}
   699  		case RulesetRuleTypeRequiredLinearHistory:
   700  			r.RequiredLinearHistory = &EmptyRuleParameters{}
   701  		case RulesetRuleTypeMergeQueue:
   702  			r.MergeQueue = &MergeQueueRuleParameters{}
   703  
   704  			if w.Parameters != nil {
   705  				if err := json.Unmarshal(w.Parameters, r.MergeQueue); err != nil {
   706  					return err
   707  				}
   708  			}
   709  		case RulesetRuleTypeRequiredDeployments:
   710  			r.RequiredDeployments = &RequiredDeploymentsRuleParameters{}
   711  
   712  			if w.Parameters != nil {
   713  				if err := json.Unmarshal(w.Parameters, r.RequiredDeployments); err != nil {
   714  					return err
   715  				}
   716  			}
   717  		case RulesetRuleTypeRequiredSignatures:
   718  			r.RequiredSignatures = &EmptyRuleParameters{}
   719  		case RulesetRuleTypePullRequest:
   720  			r.PullRequest = &PullRequestRuleParameters{}
   721  
   722  			if w.Parameters != nil {
   723  				if err := json.Unmarshal(w.Parameters, r.PullRequest); err != nil {
   724  					return err
   725  				}
   726  			}
   727  		case RulesetRuleTypeRequiredStatusChecks:
   728  			r.RequiredStatusChecks = &RequiredStatusChecksRuleParameters{}
   729  
   730  			if w.Parameters != nil {
   731  				if err := json.Unmarshal(w.Parameters, r.RequiredStatusChecks); err != nil {
   732  					return err
   733  				}
   734  			}
   735  		case RulesetRuleTypeNonFastForward:
   736  			r.NonFastForward = &EmptyRuleParameters{}
   737  		case RulesetRuleTypeCommitMessagePattern:
   738  			r.CommitMessagePattern = &PatternRuleParameters{}
   739  
   740  			if w.Parameters != nil {
   741  				if err := json.Unmarshal(w.Parameters, r.CommitMessagePattern); err != nil {
   742  					return err
   743  				}
   744  			}
   745  		case RulesetRuleTypeCommitAuthorEmailPattern:
   746  			r.CommitAuthorEmailPattern = &PatternRuleParameters{}
   747  
   748  			if w.Parameters != nil {
   749  				if err := json.Unmarshal(w.Parameters, r.CommitAuthorEmailPattern); err != nil {
   750  					return err
   751  				}
   752  			}
   753  		case RulesetRuleTypeCommitterEmailPattern:
   754  			r.CommitterEmailPattern = &PatternRuleParameters{}
   755  
   756  			if w.Parameters != nil {
   757  				if err := json.Unmarshal(w.Parameters, r.CommitterEmailPattern); err != nil {
   758  					return err
   759  				}
   760  			}
   761  		case RulesetRuleTypeBranchNamePattern:
   762  			r.BranchNamePattern = &PatternRuleParameters{}
   763  
   764  			if w.Parameters != nil {
   765  				if err := json.Unmarshal(w.Parameters, r.BranchNamePattern); err != nil {
   766  					return err
   767  				}
   768  			}
   769  		case RulesetRuleTypeTagNamePattern:
   770  			r.TagNamePattern = &PatternRuleParameters{}
   771  
   772  			if w.Parameters != nil {
   773  				if err := json.Unmarshal(w.Parameters, r.TagNamePattern); err != nil {
   774  					return err
   775  				}
   776  			}
   777  		case RulesetRuleTypeFilePathRestriction:
   778  			r.FilePathRestriction = &FilePathRestrictionRuleParameters{}
   779  
   780  			if w.Parameters != nil {
   781  				if err := json.Unmarshal(w.Parameters, r.FilePathRestriction); err != nil {
   782  					return err
   783  				}
   784  			}
   785  		case RulesetRuleTypeMaxFilePathLength:
   786  			r.MaxFilePathLength = &MaxFilePathLengthRuleParameters{}
   787  
   788  			if w.Parameters != nil {
   789  				if err := json.Unmarshal(w.Parameters, r.MaxFilePathLength); err != nil {
   790  					return err
   791  				}
   792  			}
   793  		case RulesetRuleTypeFileExtensionRestriction:
   794  			r.FileExtensionRestriction = &FileExtensionRestrictionRuleParameters{}
   795  
   796  			if w.Parameters != nil {
   797  				if err := json.Unmarshal(w.Parameters, r.FileExtensionRestriction); err != nil {
   798  					return err
   799  				}
   800  			}
   801  		case RulesetRuleTypeMaxFileSize:
   802  			r.MaxFileSize = &MaxFileSizeRuleParameters{}
   803  
   804  			if w.Parameters != nil {
   805  				if err := json.Unmarshal(w.Parameters, r.MaxFileSize); err != nil {
   806  					return err
   807  				}
   808  			}
   809  		case RulesetRuleTypeWorkflows:
   810  			r.Workflows = &WorkflowsRuleParameters{}
   811  
   812  			if w.Parameters != nil {
   813  				if err := json.Unmarshal(w.Parameters, r.Workflows); err != nil {
   814  					return err
   815  				}
   816  			}
   817  		case RulesetRuleTypeCodeScanning:
   818  			r.CodeScanning = &CodeScanningRuleParameters{}
   819  
   820  			if w.Parameters != nil {
   821  				if err := json.Unmarshal(w.Parameters, r.CodeScanning); err != nil {
   822  					return err
   823  				}
   824  			}
   825  		}
   826  	}
   827  
   828  	return nil
   829  }
   830  
   831  // branchRuleWrapper is a helper type to unmarshal a branch rule.
   832  type branchRuleWrapper struct {
   833  	Type RepositoryRuleType `json:"type"`
   834  	BranchRuleMetadata
   835  	Parameters json.RawMessage `json:"parameters,omitempty"`
   836  }
   837  
   838  // UnmarshalJSON is a custom JSON unmarshaler for BranchRules.
   839  func (r *BranchRules) UnmarshalJSON(data []byte) error {
   840  	var wrappers []*branchRuleWrapper
   841  
   842  	if err := json.Unmarshal(data, &wrappers); err != nil {
   843  		return err
   844  	}
   845  
   846  	for _, w := range wrappers {
   847  		switch w.Type {
   848  		case RulesetRuleTypeCreation:
   849  			r.Creation = append(r.Creation, &BranchRuleMetadata{RulesetSourceType: w.RulesetSourceType, RulesetSource: w.RulesetSource, RulesetID: w.RulesetID})
   850  		case RulesetRuleTypeUpdate:
   851  			params := &UpdateRuleParameters{}
   852  
   853  			if w.Parameters != nil {
   854  				if err := json.Unmarshal(w.Parameters, params); err != nil {
   855  					return err
   856  				}
   857  			}
   858  
   859  			r.Update = append(r.Update, &UpdateBranchRule{BranchRuleMetadata: w.BranchRuleMetadata, Parameters: *params})
   860  		case RulesetRuleTypeDeletion:
   861  			r.Deletion = append(r.Deletion, &BranchRuleMetadata{RulesetSourceType: w.RulesetSourceType, RulesetSource: w.RulesetSource, RulesetID: w.RulesetID})
   862  		case RulesetRuleTypeRequiredLinearHistory:
   863  			r.RequiredLinearHistory = append(r.RequiredLinearHistory, &BranchRuleMetadata{RulesetSourceType: w.RulesetSourceType, RulesetSource: w.RulesetSource, RulesetID: w.RulesetID})
   864  		case RulesetRuleTypeMergeQueue:
   865  			params := &MergeQueueRuleParameters{}
   866  
   867  			if w.Parameters != nil {
   868  				if err := json.Unmarshal(w.Parameters, params); err != nil {
   869  					return err
   870  				}
   871  			}
   872  
   873  			r.MergeQueue = append(r.MergeQueue, &MergeQueueBranchRule{BranchRuleMetadata: w.BranchRuleMetadata, Parameters: *params})
   874  		case RulesetRuleTypeRequiredDeployments:
   875  			params := &RequiredDeploymentsRuleParameters{}
   876  
   877  			if w.Parameters != nil {
   878  				if err := json.Unmarshal(w.Parameters, params); err != nil {
   879  					return err
   880  				}
   881  			}
   882  
   883  			r.RequiredDeployments = append(r.RequiredDeployments, &RequiredDeploymentsBranchRule{BranchRuleMetadata: w.BranchRuleMetadata, Parameters: *params})
   884  		case RulesetRuleTypeRequiredSignatures:
   885  			r.RequiredSignatures = append(r.RequiredSignatures, &BranchRuleMetadata{RulesetSourceType: w.RulesetSourceType, RulesetSource: w.RulesetSource, RulesetID: w.RulesetID})
   886  		case RulesetRuleTypePullRequest:
   887  			params := &PullRequestRuleParameters{}
   888  
   889  			if w.Parameters != nil {
   890  				if err := json.Unmarshal(w.Parameters, params); err != nil {
   891  					return err
   892  				}
   893  			}
   894  
   895  			r.PullRequest = append(r.PullRequest, &PullRequestBranchRule{BranchRuleMetadata: w.BranchRuleMetadata, Parameters: *params})
   896  		case RulesetRuleTypeRequiredStatusChecks:
   897  			params := &RequiredStatusChecksRuleParameters{}
   898  
   899  			if w.Parameters != nil {
   900  				if err := json.Unmarshal(w.Parameters, params); err != nil {
   901  					return err
   902  				}
   903  			}
   904  
   905  			r.RequiredStatusChecks = append(r.RequiredStatusChecks, &RequiredStatusChecksBranchRule{BranchRuleMetadata: w.BranchRuleMetadata, Parameters: *params})
   906  		case RulesetRuleTypeNonFastForward:
   907  			r.NonFastForward = append(r.NonFastForward, &BranchRuleMetadata{RulesetSourceType: w.RulesetSourceType, RulesetSource: w.RulesetSource, RulesetID: w.RulesetID})
   908  		case RulesetRuleTypeCommitMessagePattern:
   909  			params := &PatternRuleParameters{}
   910  
   911  			if w.Parameters != nil {
   912  				if err := json.Unmarshal(w.Parameters, params); err != nil {
   913  					return err
   914  				}
   915  			}
   916  
   917  			r.CommitMessagePattern = append(r.CommitMessagePattern, &PatternBranchRule{BranchRuleMetadata: w.BranchRuleMetadata, Parameters: *params})
   918  		case RulesetRuleTypeCommitAuthorEmailPattern:
   919  			params := &PatternRuleParameters{}
   920  
   921  			if w.Parameters != nil {
   922  				if err := json.Unmarshal(w.Parameters, params); err != nil {
   923  					return err
   924  				}
   925  			}
   926  
   927  			r.CommitAuthorEmailPattern = append(r.CommitAuthorEmailPattern, &PatternBranchRule{BranchRuleMetadata: w.BranchRuleMetadata, Parameters: *params})
   928  		case RulesetRuleTypeCommitterEmailPattern:
   929  			params := &PatternRuleParameters{}
   930  
   931  			if w.Parameters != nil {
   932  				if err := json.Unmarshal(w.Parameters, params); err != nil {
   933  					return err
   934  				}
   935  			}
   936  
   937  			r.CommitterEmailPattern = append(r.CommitterEmailPattern, &PatternBranchRule{BranchRuleMetadata: w.BranchRuleMetadata, Parameters: *params})
   938  		case RulesetRuleTypeBranchNamePattern:
   939  			params := &PatternRuleParameters{}
   940  
   941  			if w.Parameters != nil {
   942  				if err := json.Unmarshal(w.Parameters, params); err != nil {
   943  					return err
   944  				}
   945  			}
   946  
   947  			r.BranchNamePattern = append(r.BranchNamePattern, &PatternBranchRule{BranchRuleMetadata: w.BranchRuleMetadata, Parameters: *params})
   948  		case RulesetRuleTypeTagNamePattern:
   949  			params := &PatternRuleParameters{}
   950  
   951  			if w.Parameters != nil {
   952  				if err := json.Unmarshal(w.Parameters, params); err != nil {
   953  					return err
   954  				}
   955  			}
   956  
   957  			r.TagNamePattern = append(r.TagNamePattern, &PatternBranchRule{BranchRuleMetadata: w.BranchRuleMetadata, Parameters: *params})
   958  		case RulesetRuleTypeFilePathRestriction:
   959  			params := &FilePathRestrictionRuleParameters{}
   960  
   961  			if w.Parameters != nil {
   962  				if err := json.Unmarshal(w.Parameters, params); err != nil {
   963  					return err
   964  				}
   965  			}
   966  
   967  			r.FilePathRestriction = append(r.FilePathRestriction, &FilePathRestrictionBranchRule{BranchRuleMetadata: w.BranchRuleMetadata, Parameters: *params})
   968  		case RulesetRuleTypeMaxFilePathLength:
   969  			params := &MaxFilePathLengthRuleParameters{}
   970  
   971  			if w.Parameters != nil {
   972  				if err := json.Unmarshal(w.Parameters, params); err != nil {
   973  					return err
   974  				}
   975  			}
   976  
   977  			r.MaxFilePathLength = append(r.MaxFilePathLength, &MaxFilePathLengthBranchRule{BranchRuleMetadata: w.BranchRuleMetadata, Parameters: *params})
   978  		case RulesetRuleTypeFileExtensionRestriction:
   979  			params := &FileExtensionRestrictionRuleParameters{}
   980  
   981  			if w.Parameters != nil {
   982  				if err := json.Unmarshal(w.Parameters, params); err != nil {
   983  					return err
   984  				}
   985  			}
   986  
   987  			r.FileExtensionRestriction = append(r.FileExtensionRestriction, &FileExtensionRestrictionBranchRule{BranchRuleMetadata: w.BranchRuleMetadata, Parameters: *params})
   988  		case RulesetRuleTypeMaxFileSize:
   989  			params := &MaxFileSizeRuleParameters{}
   990  
   991  			if w.Parameters != nil {
   992  				if err := json.Unmarshal(w.Parameters, params); err != nil {
   993  					return err
   994  				}
   995  			}
   996  
   997  			r.MaxFileSize = append(r.MaxFileSize, &MaxFileSizeBranchRule{BranchRuleMetadata: w.BranchRuleMetadata, Parameters: *params})
   998  		case RulesetRuleTypeWorkflows:
   999  			params := &WorkflowsRuleParameters{}
  1000  
  1001  			if w.Parameters != nil {
  1002  				if err := json.Unmarshal(w.Parameters, params); err != nil {
  1003  					return err
  1004  				}
  1005  			}
  1006  
  1007  			r.Workflows = append(r.Workflows, &WorkflowsBranchRule{BranchRuleMetadata: w.BranchRuleMetadata, Parameters: *params})
  1008  		case RulesetRuleTypeCodeScanning:
  1009  			params := &CodeScanningRuleParameters{}
  1010  
  1011  			if w.Parameters != nil {
  1012  				if err := json.Unmarshal(w.Parameters, params); err != nil {
  1013  					return err
  1014  				}
  1015  			}
  1016  
  1017  			r.CodeScanning = append(r.CodeScanning, &CodeScanningBranchRule{BranchRuleMetadata: w.BranchRuleMetadata, Parameters: *params})
  1018  		}
  1019  	}
  1020  
  1021  	return nil
  1022  }
  1023  
  1024  // UnmarshalJSON is a custom JSON unmarshaler for RulesetRule.
  1025  func (r *RepositoryRule) UnmarshalJSON(data []byte) error {
  1026  	w := repositoryRulesetRuleWrapper{}
  1027  
  1028  	if err := json.Unmarshal(data, &w); err != nil {
  1029  		return err
  1030  	}
  1031  
  1032  	r.Type = w.Type
  1033  
  1034  	switch r.Type {
  1035  	case RulesetRuleTypeCreation:
  1036  		r.Parameters = nil
  1037  	case RulesetRuleTypeUpdate:
  1038  		p := &UpdateRuleParameters{}
  1039  
  1040  		if w.Parameters != nil {
  1041  			if err := json.Unmarshal(w.Parameters, p); err != nil {
  1042  				return err
  1043  			}
  1044  		}
  1045  
  1046  		r.Parameters = p
  1047  	case RulesetRuleTypeDeletion:
  1048  		r.Parameters = nil
  1049  	case RulesetRuleTypeRequiredLinearHistory:
  1050  		r.Parameters = nil
  1051  	case RulesetRuleTypeMergeQueue:
  1052  		p := &MergeQueueRuleParameters{}
  1053  
  1054  		if w.Parameters != nil {
  1055  			if err := json.Unmarshal(w.Parameters, p); err != nil {
  1056  				return err
  1057  			}
  1058  		}
  1059  
  1060  		r.Parameters = p
  1061  	case RulesetRuleTypeRequiredDeployments:
  1062  		p := &RequiredDeploymentsRuleParameters{}
  1063  
  1064  		if w.Parameters != nil {
  1065  			if err := json.Unmarshal(w.Parameters, p); err != nil {
  1066  				return err
  1067  			}
  1068  		}
  1069  
  1070  		r.Parameters = p
  1071  	case RulesetRuleTypeRequiredSignatures:
  1072  		r.Parameters = nil
  1073  	case RulesetRuleTypePullRequest:
  1074  		p := &PullRequestRuleParameters{}
  1075  
  1076  		if w.Parameters != nil {
  1077  			if err := json.Unmarshal(w.Parameters, p); err != nil {
  1078  				return err
  1079  			}
  1080  		}
  1081  
  1082  		r.Parameters = p
  1083  	case RulesetRuleTypeRequiredStatusChecks:
  1084  		p := &RequiredStatusChecksRuleParameters{}
  1085  
  1086  		if w.Parameters != nil {
  1087  			if err := json.Unmarshal(w.Parameters, p); err != nil {
  1088  				return err
  1089  			}
  1090  		}
  1091  
  1092  		r.Parameters = p
  1093  	case RulesetRuleTypeNonFastForward:
  1094  		r.Parameters = nil
  1095  	case RulesetRuleTypeCommitMessagePattern:
  1096  		p := &PatternRuleParameters{}
  1097  
  1098  		if w.Parameters != nil {
  1099  			if err := json.Unmarshal(w.Parameters, p); err != nil {
  1100  				return err
  1101  			}
  1102  		}
  1103  
  1104  		r.Parameters = p
  1105  	case RulesetRuleTypeCommitAuthorEmailPattern:
  1106  		p := &PatternRuleParameters{}
  1107  
  1108  		if w.Parameters != nil {
  1109  			if err := json.Unmarshal(w.Parameters, p); err != nil {
  1110  				return err
  1111  			}
  1112  		}
  1113  
  1114  		r.Parameters = p
  1115  	case RulesetRuleTypeCommitterEmailPattern:
  1116  		p := &PatternRuleParameters{}
  1117  
  1118  		if w.Parameters != nil {
  1119  			if err := json.Unmarshal(w.Parameters, p); err != nil {
  1120  				return err
  1121  			}
  1122  		}
  1123  
  1124  		r.Parameters = p
  1125  	case RulesetRuleTypeBranchNamePattern:
  1126  		p := &PatternRuleParameters{}
  1127  
  1128  		if w.Parameters != nil {
  1129  			if err := json.Unmarshal(w.Parameters, p); err != nil {
  1130  				return err
  1131  			}
  1132  		}
  1133  
  1134  		r.Parameters = p
  1135  	case RulesetRuleTypeTagNamePattern:
  1136  		p := &PatternRuleParameters{}
  1137  
  1138  		if w.Parameters != nil {
  1139  			if err := json.Unmarshal(w.Parameters, p); err != nil {
  1140  				return err
  1141  			}
  1142  		}
  1143  
  1144  		r.Parameters = p
  1145  	case RulesetRuleTypeFilePathRestriction:
  1146  		p := &FilePathRestrictionRuleParameters{}
  1147  
  1148  		if w.Parameters != nil {
  1149  			if err := json.Unmarshal(w.Parameters, p); err != nil {
  1150  				return err
  1151  			}
  1152  		}
  1153  
  1154  		r.Parameters = p
  1155  	case RulesetRuleTypeMaxFilePathLength:
  1156  		p := &MaxFilePathLengthRuleParameters{}
  1157  
  1158  		if w.Parameters != nil {
  1159  			if err := json.Unmarshal(w.Parameters, p); err != nil {
  1160  				return err
  1161  			}
  1162  		}
  1163  
  1164  		r.Parameters = p
  1165  	case RulesetRuleTypeFileExtensionRestriction:
  1166  		p := &FileExtensionRestrictionRuleParameters{}
  1167  
  1168  		if w.Parameters != nil {
  1169  			if err := json.Unmarshal(w.Parameters, p); err != nil {
  1170  				return err
  1171  			}
  1172  		}
  1173  
  1174  		r.Parameters = p
  1175  	case RulesetRuleTypeMaxFileSize:
  1176  		p := &MaxFileSizeRuleParameters{}
  1177  
  1178  		if w.Parameters != nil {
  1179  			if err := json.Unmarshal(w.Parameters, p); err != nil {
  1180  				return err
  1181  			}
  1182  		}
  1183  
  1184  		r.Parameters = p
  1185  	case RulesetRuleTypeWorkflows:
  1186  		p := &WorkflowsRuleParameters{}
  1187  
  1188  		if w.Parameters != nil {
  1189  			if err := json.Unmarshal(w.Parameters, p); err != nil {
  1190  				return err
  1191  			}
  1192  		}
  1193  
  1194  		r.Parameters = p
  1195  	case RulesetRuleTypeCodeScanning:
  1196  		p := &CodeScanningRuleParameters{}
  1197  
  1198  		if w.Parameters != nil {
  1199  			if err := json.Unmarshal(w.Parameters, p); err != nil {
  1200  				return err
  1201  			}
  1202  		}
  1203  
  1204  		r.Parameters = p
  1205  	}
  1206  
  1207  	return nil
  1208  }