github.com/google/go-github/v69@v69.2.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  	DismissStaleReviewsOnPush      bool          `json:"dismiss_stale_reviews_on_push"`
   400  	RequireCodeOwnerReview         bool          `json:"require_code_owner_review"`
   401  	RequireLastPushApproval        bool          `json:"require_last_push_approval"`
   402  	RequiredApprovingReviewCount   int           `json:"required_approving_review_count"`
   403  	RequiredReviewThreadResolution bool          `json:"required_review_thread_resolution"`
   404  }
   405  
   406  // RequiredStatusChecksRuleParameters represents the required status checks rule parameters.
   407  type RequiredStatusChecksRuleParameters struct {
   408  	DoNotEnforceOnCreate             *bool              `json:"do_not_enforce_on_create,omitempty"`
   409  	RequiredStatusChecks             []*RuleStatusCheck `json:"required_status_checks"`
   410  	StrictRequiredStatusChecksPolicy bool               `json:"strict_required_status_checks_policy"`
   411  }
   412  
   413  // RuleStatusCheck represents a status checks for the required status checks rule parameters.
   414  type RuleStatusCheck struct {
   415  	Context       string `json:"context"`
   416  	IntegrationID *int64 `json:"integration_id,omitempty"`
   417  }
   418  
   419  // PatternRuleParameters represents the parameters for a pattern rule.
   420  type PatternRuleParameters struct {
   421  	Name *string `json:"name,omitempty"`
   422  	// If Negate is true, the rule will fail if the pattern matches.
   423  	Negate   *bool               `json:"negate,omitempty"`
   424  	Operator PatternRuleOperator `json:"operator"`
   425  	Pattern  string              `json:"pattern"`
   426  }
   427  
   428  // FilePathRestrictionRuleParameters represents the file path restriction rule parameters.
   429  type FilePathRestrictionRuleParameters struct {
   430  	RestrictedFilePaths []string `json:"restricted_file_paths"`
   431  }
   432  
   433  // MaxFilePathLengthRuleParameters represents the max file path length rule parameters.
   434  type MaxFilePathLengthRuleParameters struct {
   435  	MaxFilePathLength int `json:"max_file_path_length"`
   436  }
   437  
   438  // FileExtensionRestrictionRuleParameters represents the file extension restriction rule parameters.
   439  type FileExtensionRestrictionRuleParameters struct {
   440  	RestrictedFileExtensions []string `json:"restricted_file_extensions"`
   441  }
   442  
   443  // MaxFileSizeRuleParameters represents the max file size rule parameters.
   444  type MaxFileSizeRuleParameters struct {
   445  	MaxFileSize int64 `json:"max_file_size"`
   446  }
   447  
   448  // WorkflowsRuleParameters represents the workflows rule parameters.
   449  type WorkflowsRuleParameters struct {
   450  	DoNotEnforceOnCreate *bool           `json:"do_not_enforce_on_create,omitempty"`
   451  	Workflows            []*RuleWorkflow `json:"workflows"`
   452  }
   453  
   454  // RuleWorkflow represents a Workflow for the workflows rule parameters.
   455  type RuleWorkflow struct {
   456  	Path         string  `json:"path"`
   457  	Ref          *string `json:"ref,omitempty"`
   458  	RepositoryID *int64  `json:"repository_id,omitempty"`
   459  	SHA          *string `json:"sha,omitempty"`
   460  }
   461  
   462  // CodeScanningRuleParameters represents the code scanning rule parameters.
   463  type CodeScanningRuleParameters struct {
   464  	CodeScanningTools []*RuleCodeScanningTool `json:"code_scanning_tools"`
   465  }
   466  
   467  // RuleCodeScanningTool represents a single code scanning tool for the code scanning parameters.
   468  type RuleCodeScanningTool struct {
   469  	AlertsThreshold         CodeScanningAlertsThreshold         `json:"alerts_threshold"`
   470  	SecurityAlertsThreshold CodeScanningSecurityAlertsThreshold `json:"security_alerts_threshold"`
   471  	Tool                    string                              `json:"tool"`
   472  }
   473  
   474  // repositoryRulesetRuleWrapper is a helper type to marshal & unmarshal a ruleset rule.
   475  type repositoryRulesetRuleWrapper struct {
   476  	Type       RepositoryRuleType `json:"type"`
   477  	Parameters json.RawMessage    `json:"parameters,omitempty"`
   478  }
   479  
   480  // MarshalJSON is a custom JSON marshaler for RulesetRules.
   481  func (r *RepositoryRulesetRules) MarshalJSON() ([]byte, error) {
   482  	// The RepositoryRulesetRules type marshals to between 1 and 21 rules.
   483  	// If new rules are added to RepositoryRulesetRules the capacity below needs increasing
   484  	rawRules := make([]json.RawMessage, 0, 21)
   485  
   486  	if r.Creation != nil {
   487  		bytes, err := marshalRepositoryRulesetRule(RulesetRuleTypeCreation, r.Creation)
   488  		if err != nil {
   489  			return nil, err
   490  		}
   491  		rawRules = append(rawRules, json.RawMessage(bytes))
   492  	}
   493  
   494  	if r.Update != nil {
   495  		bytes, err := marshalRepositoryRulesetRule(RulesetRuleTypeUpdate, r.Update)
   496  		if err != nil {
   497  			return nil, err
   498  		}
   499  		rawRules = append(rawRules, json.RawMessage(bytes))
   500  	}
   501  
   502  	if r.Deletion != nil {
   503  		bytes, err := marshalRepositoryRulesetRule(RulesetRuleTypeDeletion, r.Deletion)
   504  		if err != nil {
   505  			return nil, err
   506  		}
   507  		rawRules = append(rawRules, json.RawMessage(bytes))
   508  	}
   509  
   510  	if r.RequiredLinearHistory != nil {
   511  		bytes, err := marshalRepositoryRulesetRule(RulesetRuleTypeRequiredLinearHistory, r.RequiredLinearHistory)
   512  		if err != nil {
   513  			return nil, err
   514  		}
   515  		rawRules = append(rawRules, json.RawMessage(bytes))
   516  	}
   517  
   518  	if r.MergeQueue != nil {
   519  		bytes, err := marshalRepositoryRulesetRule(RulesetRuleTypeMergeQueue, r.MergeQueue)
   520  		if err != nil {
   521  			return nil, err
   522  		}
   523  		rawRules = append(rawRules, json.RawMessage(bytes))
   524  	}
   525  
   526  	if r.RequiredDeployments != nil {
   527  		bytes, err := marshalRepositoryRulesetRule(RulesetRuleTypeRequiredDeployments, r.RequiredDeployments)
   528  		if err != nil {
   529  			return nil, err
   530  		}
   531  		rawRules = append(rawRules, json.RawMessage(bytes))
   532  	}
   533  
   534  	if r.RequiredSignatures != nil {
   535  		bytes, err := marshalRepositoryRulesetRule(RulesetRuleTypeRequiredSignatures, r.RequiredSignatures)
   536  		if err != nil {
   537  			return nil, err
   538  		}
   539  		rawRules = append(rawRules, json.RawMessage(bytes))
   540  	}
   541  
   542  	if r.PullRequest != nil {
   543  		bytes, err := marshalRepositoryRulesetRule(RulesetRuleTypePullRequest, r.PullRequest)
   544  		if err != nil {
   545  			return nil, err
   546  		}
   547  		rawRules = append(rawRules, json.RawMessage(bytes))
   548  	}
   549  
   550  	if r.RequiredStatusChecks != nil {
   551  		bytes, err := marshalRepositoryRulesetRule(RulesetRuleTypeRequiredStatusChecks, r.RequiredStatusChecks)
   552  		if err != nil {
   553  			return nil, err
   554  		}
   555  		rawRules = append(rawRules, json.RawMessage(bytes))
   556  	}
   557  
   558  	if r.NonFastForward != nil {
   559  		bytes, err := marshalRepositoryRulesetRule(RulesetRuleTypeNonFastForward, r.NonFastForward)
   560  		if err != nil {
   561  			return nil, err
   562  		}
   563  		rawRules = append(rawRules, json.RawMessage(bytes))
   564  	}
   565  
   566  	if r.CommitMessagePattern != nil {
   567  		bytes, err := marshalRepositoryRulesetRule(RulesetRuleTypeCommitMessagePattern, r.CommitMessagePattern)
   568  		if err != nil {
   569  			return nil, err
   570  		}
   571  		rawRules = append(rawRules, json.RawMessage(bytes))
   572  	}
   573  
   574  	if r.CommitAuthorEmailPattern != nil {
   575  		bytes, err := marshalRepositoryRulesetRule(RulesetRuleTypeCommitAuthorEmailPattern, r.CommitAuthorEmailPattern)
   576  		if err != nil {
   577  			return nil, err
   578  		}
   579  		rawRules = append(rawRules, json.RawMessage(bytes))
   580  	}
   581  
   582  	if r.CommitterEmailPattern != nil {
   583  		bytes, err := marshalRepositoryRulesetRule(RulesetRuleTypeCommitterEmailPattern, r.CommitterEmailPattern)
   584  		if err != nil {
   585  			return nil, err
   586  		}
   587  		rawRules = append(rawRules, json.RawMessage(bytes))
   588  	}
   589  
   590  	if r.BranchNamePattern != nil {
   591  		bytes, err := marshalRepositoryRulesetRule(RulesetRuleTypeBranchNamePattern, r.BranchNamePattern)
   592  		if err != nil {
   593  			return nil, err
   594  		}
   595  		rawRules = append(rawRules, json.RawMessage(bytes))
   596  	}
   597  
   598  	if r.TagNamePattern != nil {
   599  		bytes, err := marshalRepositoryRulesetRule(RulesetRuleTypeTagNamePattern, r.TagNamePattern)
   600  		if err != nil {
   601  			return nil, err
   602  		}
   603  		rawRules = append(rawRules, json.RawMessage(bytes))
   604  	}
   605  
   606  	if r.FilePathRestriction != nil {
   607  		bytes, err := marshalRepositoryRulesetRule(RulesetRuleTypeFilePathRestriction, r.FilePathRestriction)
   608  		if err != nil {
   609  			return nil, err
   610  		}
   611  		rawRules = append(rawRules, json.RawMessage(bytes))
   612  	}
   613  
   614  	if r.MaxFilePathLength != nil {
   615  		bytes, err := marshalRepositoryRulesetRule(RulesetRuleTypeMaxFilePathLength, r.MaxFilePathLength)
   616  		if err != nil {
   617  			return nil, err
   618  		}
   619  		rawRules = append(rawRules, json.RawMessage(bytes))
   620  	}
   621  
   622  	if r.FileExtensionRestriction != nil {
   623  		bytes, err := marshalRepositoryRulesetRule(RulesetRuleTypeFileExtensionRestriction, r.FileExtensionRestriction)
   624  		if err != nil {
   625  			return nil, err
   626  		}
   627  		rawRules = append(rawRules, json.RawMessage(bytes))
   628  	}
   629  
   630  	if r.MaxFileSize != nil {
   631  		bytes, err := marshalRepositoryRulesetRule(RulesetRuleTypeMaxFileSize, r.MaxFileSize)
   632  		if err != nil {
   633  			return nil, err
   634  		}
   635  		rawRules = append(rawRules, json.RawMessage(bytes))
   636  	}
   637  
   638  	if r.Workflows != nil {
   639  		bytes, err := marshalRepositoryRulesetRule(RulesetRuleTypeWorkflows, r.Workflows)
   640  		if err != nil {
   641  			return nil, err
   642  		}
   643  		rawRules = append(rawRules, json.RawMessage(bytes))
   644  	}
   645  
   646  	if r.CodeScanning != nil {
   647  		bytes, err := marshalRepositoryRulesetRule(RulesetRuleTypeCodeScanning, r.CodeScanning)
   648  		if err != nil {
   649  			return nil, err
   650  		}
   651  		rawRules = append(rawRules, json.RawMessage(bytes))
   652  	}
   653  
   654  	return json.Marshal(rawRules)
   655  }
   656  
   657  // marshalRepositoryRulesetRule is a helper function to marshal a ruleset rule.
   658  //
   659  // TODO: Benchmark the code that uses reflection.
   660  // TODO: Use a generator here instead of reflection if there is a significant performance hit.
   661  func marshalRepositoryRulesetRule[T any](t RepositoryRuleType, params T) ([]byte, error) {
   662  	paramsType := reflect.TypeFor[T]()
   663  
   664  	if paramsType.Kind() == reflect.Pointer && (reflect.ValueOf(params).IsNil() || reflect.ValueOf(params).Elem().IsZero()) {
   665  		return json.Marshal(repositoryRulesetRuleWrapper{Type: t})
   666  	}
   667  
   668  	bytes, err := json.Marshal(params)
   669  	if err != nil {
   670  		return nil, err
   671  	}
   672  
   673  	return json.Marshal(repositoryRulesetRuleWrapper{Type: t, Parameters: json.RawMessage(bytes)})
   674  }
   675  
   676  // UnmarshalJSON is a custom JSON unmarshaler for RulesetRules.
   677  func (r *RepositoryRulesetRules) UnmarshalJSON(data []byte) error {
   678  	var wrappers []*repositoryRulesetRuleWrapper
   679  
   680  	if err := json.Unmarshal(data, &wrappers); err != nil {
   681  		return err
   682  	}
   683  
   684  	for _, w := range wrappers {
   685  		switch w.Type {
   686  		case RulesetRuleTypeCreation:
   687  			r.Creation = &EmptyRuleParameters{}
   688  		case RulesetRuleTypeUpdate:
   689  			r.Update = &UpdateRuleParameters{}
   690  
   691  			if w.Parameters != nil {
   692  				if err := json.Unmarshal(w.Parameters, r.Update); err != nil {
   693  					return err
   694  				}
   695  			}
   696  		case RulesetRuleTypeDeletion:
   697  			r.Deletion = &EmptyRuleParameters{}
   698  		case RulesetRuleTypeRequiredLinearHistory:
   699  			r.RequiredLinearHistory = &EmptyRuleParameters{}
   700  		case RulesetRuleTypeMergeQueue:
   701  			r.MergeQueue = &MergeQueueRuleParameters{}
   702  
   703  			if w.Parameters != nil {
   704  				if err := json.Unmarshal(w.Parameters, r.MergeQueue); err != nil {
   705  					return err
   706  				}
   707  			}
   708  		case RulesetRuleTypeRequiredDeployments:
   709  			r.RequiredDeployments = &RequiredDeploymentsRuleParameters{}
   710  
   711  			if w.Parameters != nil {
   712  				if err := json.Unmarshal(w.Parameters, r.RequiredDeployments); err != nil {
   713  					return err
   714  				}
   715  			}
   716  		case RulesetRuleTypeRequiredSignatures:
   717  			r.RequiredSignatures = &EmptyRuleParameters{}
   718  		case RulesetRuleTypePullRequest:
   719  			r.PullRequest = &PullRequestRuleParameters{}
   720  
   721  			if w.Parameters != nil {
   722  				if err := json.Unmarshal(w.Parameters, r.PullRequest); err != nil {
   723  					return err
   724  				}
   725  			}
   726  		case RulesetRuleTypeRequiredStatusChecks:
   727  			r.RequiredStatusChecks = &RequiredStatusChecksRuleParameters{}
   728  
   729  			if w.Parameters != nil {
   730  				if err := json.Unmarshal(w.Parameters, r.RequiredStatusChecks); err != nil {
   731  					return err
   732  				}
   733  			}
   734  		case RulesetRuleTypeNonFastForward:
   735  			r.NonFastForward = &EmptyRuleParameters{}
   736  		case RulesetRuleTypeCommitMessagePattern:
   737  			r.CommitMessagePattern = &PatternRuleParameters{}
   738  
   739  			if w.Parameters != nil {
   740  				if err := json.Unmarshal(w.Parameters, r.CommitMessagePattern); err != nil {
   741  					return err
   742  				}
   743  			}
   744  		case RulesetRuleTypeCommitAuthorEmailPattern:
   745  			r.CommitAuthorEmailPattern = &PatternRuleParameters{}
   746  
   747  			if w.Parameters != nil {
   748  				if err := json.Unmarshal(w.Parameters, r.CommitAuthorEmailPattern); err != nil {
   749  					return err
   750  				}
   751  			}
   752  		case RulesetRuleTypeCommitterEmailPattern:
   753  			r.CommitterEmailPattern = &PatternRuleParameters{}
   754  
   755  			if w.Parameters != nil {
   756  				if err := json.Unmarshal(w.Parameters, r.CommitterEmailPattern); err != nil {
   757  					return err
   758  				}
   759  			}
   760  		case RulesetRuleTypeBranchNamePattern:
   761  			r.BranchNamePattern = &PatternRuleParameters{}
   762  
   763  			if w.Parameters != nil {
   764  				if err := json.Unmarshal(w.Parameters, r.BranchNamePattern); err != nil {
   765  					return err
   766  				}
   767  			}
   768  		case RulesetRuleTypeTagNamePattern:
   769  			r.TagNamePattern = &PatternRuleParameters{}
   770  
   771  			if w.Parameters != nil {
   772  				if err := json.Unmarshal(w.Parameters, r.TagNamePattern); err != nil {
   773  					return err
   774  				}
   775  			}
   776  		case RulesetRuleTypeFilePathRestriction:
   777  			r.FilePathRestriction = &FilePathRestrictionRuleParameters{}
   778  
   779  			if w.Parameters != nil {
   780  				if err := json.Unmarshal(w.Parameters, r.FilePathRestriction); err != nil {
   781  					return err
   782  				}
   783  			}
   784  		case RulesetRuleTypeMaxFilePathLength:
   785  			r.MaxFilePathLength = &MaxFilePathLengthRuleParameters{}
   786  
   787  			if w.Parameters != nil {
   788  				if err := json.Unmarshal(w.Parameters, r.MaxFilePathLength); err != nil {
   789  					return err
   790  				}
   791  			}
   792  		case RulesetRuleTypeFileExtensionRestriction:
   793  			r.FileExtensionRestriction = &FileExtensionRestrictionRuleParameters{}
   794  
   795  			if w.Parameters != nil {
   796  				if err := json.Unmarshal(w.Parameters, r.FileExtensionRestriction); err != nil {
   797  					return err
   798  				}
   799  			}
   800  		case RulesetRuleTypeMaxFileSize:
   801  			r.MaxFileSize = &MaxFileSizeRuleParameters{}
   802  
   803  			if w.Parameters != nil {
   804  				if err := json.Unmarshal(w.Parameters, r.MaxFileSize); err != nil {
   805  					return err
   806  				}
   807  			}
   808  		case RulesetRuleTypeWorkflows:
   809  			r.Workflows = &WorkflowsRuleParameters{}
   810  
   811  			if w.Parameters != nil {
   812  				if err := json.Unmarshal(w.Parameters, r.Workflows); err != nil {
   813  					return err
   814  				}
   815  			}
   816  		case RulesetRuleTypeCodeScanning:
   817  			r.CodeScanning = &CodeScanningRuleParameters{}
   818  
   819  			if w.Parameters != nil {
   820  				if err := json.Unmarshal(w.Parameters, r.CodeScanning); err != nil {
   821  					return err
   822  				}
   823  			}
   824  		}
   825  	}
   826  
   827  	return nil
   828  }
   829  
   830  // branchRuleWrapper is a helper type to unmarshal a branch rule.
   831  type branchRuleWrapper struct {
   832  	Type RepositoryRuleType `json:"type"`
   833  	BranchRuleMetadata
   834  	Parameters json.RawMessage `json:"parameters,omitempty"`
   835  }
   836  
   837  // UnmarshalJSON is a custom JSON unmarshaler for BranchRules.
   838  func (r *BranchRules) UnmarshalJSON(data []byte) error {
   839  	var wrappers []*branchRuleWrapper
   840  
   841  	if err := json.Unmarshal(data, &wrappers); err != nil {
   842  		return err
   843  	}
   844  
   845  	for _, w := range wrappers {
   846  		switch w.Type {
   847  		case RulesetRuleTypeCreation:
   848  			r.Creation = append(r.Creation, &BranchRuleMetadata{RulesetSourceType: w.RulesetSourceType, RulesetSource: w.RulesetSource, RulesetID: w.RulesetID})
   849  		case RulesetRuleTypeUpdate:
   850  			params := &UpdateRuleParameters{}
   851  
   852  			if w.Parameters != nil {
   853  				if err := json.Unmarshal(w.Parameters, params); err != nil {
   854  					return err
   855  				}
   856  			}
   857  
   858  			r.Update = append(r.Update, &UpdateBranchRule{BranchRuleMetadata: w.BranchRuleMetadata, Parameters: *params})
   859  		case RulesetRuleTypeDeletion:
   860  			r.Deletion = append(r.Deletion, &BranchRuleMetadata{RulesetSourceType: w.RulesetSourceType, RulesetSource: w.RulesetSource, RulesetID: w.RulesetID})
   861  		case RulesetRuleTypeRequiredLinearHistory:
   862  			r.RequiredLinearHistory = append(r.RequiredLinearHistory, &BranchRuleMetadata{RulesetSourceType: w.RulesetSourceType, RulesetSource: w.RulesetSource, RulesetID: w.RulesetID})
   863  		case RulesetRuleTypeMergeQueue:
   864  			params := &MergeQueueRuleParameters{}
   865  
   866  			if w.Parameters != nil {
   867  				if err := json.Unmarshal(w.Parameters, params); err != nil {
   868  					return err
   869  				}
   870  			}
   871  
   872  			r.MergeQueue = append(r.MergeQueue, &MergeQueueBranchRule{BranchRuleMetadata: w.BranchRuleMetadata, Parameters: *params})
   873  		case RulesetRuleTypeRequiredDeployments:
   874  			params := &RequiredDeploymentsRuleParameters{}
   875  
   876  			if w.Parameters != nil {
   877  				if err := json.Unmarshal(w.Parameters, params); err != nil {
   878  					return err
   879  				}
   880  			}
   881  
   882  			r.RequiredDeployments = append(r.RequiredDeployments, &RequiredDeploymentsBranchRule{BranchRuleMetadata: w.BranchRuleMetadata, Parameters: *params})
   883  		case RulesetRuleTypeRequiredSignatures:
   884  			r.RequiredSignatures = append(r.RequiredSignatures, &BranchRuleMetadata{RulesetSourceType: w.RulesetSourceType, RulesetSource: w.RulesetSource, RulesetID: w.RulesetID})
   885  		case RulesetRuleTypePullRequest:
   886  			params := &PullRequestRuleParameters{}
   887  
   888  			if w.Parameters != nil {
   889  				if err := json.Unmarshal(w.Parameters, params); err != nil {
   890  					return err
   891  				}
   892  			}
   893  
   894  			r.PullRequest = append(r.PullRequest, &PullRequestBranchRule{BranchRuleMetadata: w.BranchRuleMetadata, Parameters: *params})
   895  		case RulesetRuleTypeRequiredStatusChecks:
   896  			params := &RequiredStatusChecksRuleParameters{}
   897  
   898  			if w.Parameters != nil {
   899  				if err := json.Unmarshal(w.Parameters, params); err != nil {
   900  					return err
   901  				}
   902  			}
   903  
   904  			r.RequiredStatusChecks = append(r.RequiredStatusChecks, &RequiredStatusChecksBranchRule{BranchRuleMetadata: w.BranchRuleMetadata, Parameters: *params})
   905  		case RulesetRuleTypeNonFastForward:
   906  			r.NonFastForward = append(r.NonFastForward, &BranchRuleMetadata{RulesetSourceType: w.RulesetSourceType, RulesetSource: w.RulesetSource, RulesetID: w.RulesetID})
   907  		case RulesetRuleTypeCommitMessagePattern:
   908  			params := &PatternRuleParameters{}
   909  
   910  			if w.Parameters != nil {
   911  				if err := json.Unmarshal(w.Parameters, params); err != nil {
   912  					return err
   913  				}
   914  			}
   915  
   916  			r.CommitMessagePattern = append(r.CommitMessagePattern, &PatternBranchRule{BranchRuleMetadata: w.BranchRuleMetadata, Parameters: *params})
   917  		case RulesetRuleTypeCommitAuthorEmailPattern:
   918  			params := &PatternRuleParameters{}
   919  
   920  			if w.Parameters != nil {
   921  				if err := json.Unmarshal(w.Parameters, params); err != nil {
   922  					return err
   923  				}
   924  			}
   925  
   926  			r.CommitAuthorEmailPattern = append(r.CommitAuthorEmailPattern, &PatternBranchRule{BranchRuleMetadata: w.BranchRuleMetadata, Parameters: *params})
   927  		case RulesetRuleTypeCommitterEmailPattern:
   928  			params := &PatternRuleParameters{}
   929  
   930  			if w.Parameters != nil {
   931  				if err := json.Unmarshal(w.Parameters, params); err != nil {
   932  					return err
   933  				}
   934  			}
   935  
   936  			r.CommitterEmailPattern = append(r.CommitterEmailPattern, &PatternBranchRule{BranchRuleMetadata: w.BranchRuleMetadata, Parameters: *params})
   937  		case RulesetRuleTypeBranchNamePattern:
   938  			params := &PatternRuleParameters{}
   939  
   940  			if w.Parameters != nil {
   941  				if err := json.Unmarshal(w.Parameters, params); err != nil {
   942  					return err
   943  				}
   944  			}
   945  
   946  			r.BranchNamePattern = append(r.BranchNamePattern, &PatternBranchRule{BranchRuleMetadata: w.BranchRuleMetadata, Parameters: *params})
   947  		case RulesetRuleTypeTagNamePattern:
   948  			params := &PatternRuleParameters{}
   949  
   950  			if w.Parameters != nil {
   951  				if err := json.Unmarshal(w.Parameters, params); err != nil {
   952  					return err
   953  				}
   954  			}
   955  
   956  			r.TagNamePattern = append(r.TagNamePattern, &PatternBranchRule{BranchRuleMetadata: w.BranchRuleMetadata, Parameters: *params})
   957  		case RulesetRuleTypeFilePathRestriction:
   958  			params := &FilePathRestrictionRuleParameters{}
   959  
   960  			if w.Parameters != nil {
   961  				if err := json.Unmarshal(w.Parameters, params); err != nil {
   962  					return err
   963  				}
   964  			}
   965  
   966  			r.FilePathRestriction = append(r.FilePathRestriction, &FilePathRestrictionBranchRule{BranchRuleMetadata: w.BranchRuleMetadata, Parameters: *params})
   967  		case RulesetRuleTypeMaxFilePathLength:
   968  			params := &MaxFilePathLengthRuleParameters{}
   969  
   970  			if w.Parameters != nil {
   971  				if err := json.Unmarshal(w.Parameters, params); err != nil {
   972  					return err
   973  				}
   974  			}
   975  
   976  			r.MaxFilePathLength = append(r.MaxFilePathLength, &MaxFilePathLengthBranchRule{BranchRuleMetadata: w.BranchRuleMetadata, Parameters: *params})
   977  		case RulesetRuleTypeFileExtensionRestriction:
   978  			params := &FileExtensionRestrictionRuleParameters{}
   979  
   980  			if w.Parameters != nil {
   981  				if err := json.Unmarshal(w.Parameters, params); err != nil {
   982  					return err
   983  				}
   984  			}
   985  
   986  			r.FileExtensionRestriction = append(r.FileExtensionRestriction, &FileExtensionRestrictionBranchRule{BranchRuleMetadata: w.BranchRuleMetadata, Parameters: *params})
   987  		case RulesetRuleTypeMaxFileSize:
   988  			params := &MaxFileSizeRuleParameters{}
   989  
   990  			if w.Parameters != nil {
   991  				if err := json.Unmarshal(w.Parameters, params); err != nil {
   992  					return err
   993  				}
   994  			}
   995  
   996  			r.MaxFileSize = append(r.MaxFileSize, &MaxFileSizeBranchRule{BranchRuleMetadata: w.BranchRuleMetadata, Parameters: *params})
   997  		case RulesetRuleTypeWorkflows:
   998  			params := &WorkflowsRuleParameters{}
   999  
  1000  			if w.Parameters != nil {
  1001  				if err := json.Unmarshal(w.Parameters, params); err != nil {
  1002  					return err
  1003  				}
  1004  			}
  1005  
  1006  			r.Workflows = append(r.Workflows, &WorkflowsBranchRule{BranchRuleMetadata: w.BranchRuleMetadata, Parameters: *params})
  1007  		case RulesetRuleTypeCodeScanning:
  1008  			params := &CodeScanningRuleParameters{}
  1009  
  1010  			if w.Parameters != nil {
  1011  				if err := json.Unmarshal(w.Parameters, params); err != nil {
  1012  					return err
  1013  				}
  1014  			}
  1015  
  1016  			r.CodeScanning = append(r.CodeScanning, &CodeScanningBranchRule{BranchRuleMetadata: w.BranchRuleMetadata, Parameters: *params})
  1017  		}
  1018  	}
  1019  
  1020  	return nil
  1021  }
  1022  
  1023  // UnmarshalJSON is a custom JSON unmarshaler for RulesetRule.
  1024  func (r *RepositoryRule) UnmarshalJSON(data []byte) error {
  1025  	w := repositoryRulesetRuleWrapper{}
  1026  
  1027  	if err := json.Unmarshal(data, &w); err != nil {
  1028  		return err
  1029  	}
  1030  
  1031  	r.Type = w.Type
  1032  
  1033  	switch r.Type {
  1034  	case RulesetRuleTypeCreation:
  1035  		r.Parameters = nil
  1036  	case RulesetRuleTypeUpdate:
  1037  		p := &UpdateRuleParameters{}
  1038  
  1039  		if w.Parameters != nil {
  1040  			if err := json.Unmarshal(w.Parameters, p); err != nil {
  1041  				return err
  1042  			}
  1043  		}
  1044  
  1045  		r.Parameters = p
  1046  	case RulesetRuleTypeDeletion:
  1047  		r.Parameters = nil
  1048  	case RulesetRuleTypeRequiredLinearHistory:
  1049  		r.Parameters = nil
  1050  	case RulesetRuleTypeMergeQueue:
  1051  		p := &MergeQueueRuleParameters{}
  1052  
  1053  		if w.Parameters != nil {
  1054  			if err := json.Unmarshal(w.Parameters, p); err != nil {
  1055  				return err
  1056  			}
  1057  		}
  1058  
  1059  		r.Parameters = p
  1060  	case RulesetRuleTypeRequiredDeployments:
  1061  		p := &RequiredDeploymentsRuleParameters{}
  1062  
  1063  		if w.Parameters != nil {
  1064  			if err := json.Unmarshal(w.Parameters, p); err != nil {
  1065  				return err
  1066  			}
  1067  		}
  1068  
  1069  		r.Parameters = p
  1070  	case RulesetRuleTypeRequiredSignatures:
  1071  		r.Parameters = nil
  1072  	case RulesetRuleTypePullRequest:
  1073  		p := &PullRequestRuleParameters{}
  1074  
  1075  		if w.Parameters != nil {
  1076  			if err := json.Unmarshal(w.Parameters, p); err != nil {
  1077  				return err
  1078  			}
  1079  		}
  1080  
  1081  		r.Parameters = p
  1082  	case RulesetRuleTypeRequiredStatusChecks:
  1083  		p := &RequiredStatusChecksRuleParameters{}
  1084  
  1085  		if w.Parameters != nil {
  1086  			if err := json.Unmarshal(w.Parameters, p); err != nil {
  1087  				return err
  1088  			}
  1089  		}
  1090  
  1091  		r.Parameters = p
  1092  	case RulesetRuleTypeNonFastForward:
  1093  		r.Parameters = nil
  1094  	case RulesetRuleTypeCommitMessagePattern:
  1095  		p := &PatternRuleParameters{}
  1096  
  1097  		if w.Parameters != nil {
  1098  			if err := json.Unmarshal(w.Parameters, p); err != nil {
  1099  				return err
  1100  			}
  1101  		}
  1102  
  1103  		r.Parameters = p
  1104  	case RulesetRuleTypeCommitAuthorEmailPattern:
  1105  		p := &PatternRuleParameters{}
  1106  
  1107  		if w.Parameters != nil {
  1108  			if err := json.Unmarshal(w.Parameters, p); err != nil {
  1109  				return err
  1110  			}
  1111  		}
  1112  
  1113  		r.Parameters = p
  1114  	case RulesetRuleTypeCommitterEmailPattern:
  1115  		p := &PatternRuleParameters{}
  1116  
  1117  		if w.Parameters != nil {
  1118  			if err := json.Unmarshal(w.Parameters, p); err != nil {
  1119  				return err
  1120  			}
  1121  		}
  1122  
  1123  		r.Parameters = p
  1124  	case RulesetRuleTypeBranchNamePattern:
  1125  		p := &PatternRuleParameters{}
  1126  
  1127  		if w.Parameters != nil {
  1128  			if err := json.Unmarshal(w.Parameters, p); err != nil {
  1129  				return err
  1130  			}
  1131  		}
  1132  
  1133  		r.Parameters = p
  1134  	case RulesetRuleTypeTagNamePattern:
  1135  		p := &PatternRuleParameters{}
  1136  
  1137  		if w.Parameters != nil {
  1138  			if err := json.Unmarshal(w.Parameters, p); err != nil {
  1139  				return err
  1140  			}
  1141  		}
  1142  
  1143  		r.Parameters = p
  1144  	case RulesetRuleTypeFilePathRestriction:
  1145  		p := &FilePathRestrictionRuleParameters{}
  1146  
  1147  		if w.Parameters != nil {
  1148  			if err := json.Unmarshal(w.Parameters, p); err != nil {
  1149  				return err
  1150  			}
  1151  		}
  1152  
  1153  		r.Parameters = p
  1154  	case RulesetRuleTypeMaxFilePathLength:
  1155  		p := &MaxFilePathLengthRuleParameters{}
  1156  
  1157  		if w.Parameters != nil {
  1158  			if err := json.Unmarshal(w.Parameters, p); err != nil {
  1159  				return err
  1160  			}
  1161  		}
  1162  
  1163  		r.Parameters = p
  1164  	case RulesetRuleTypeFileExtensionRestriction:
  1165  		p := &FileExtensionRestrictionRuleParameters{}
  1166  
  1167  		if w.Parameters != nil {
  1168  			if err := json.Unmarshal(w.Parameters, p); err != nil {
  1169  				return err
  1170  			}
  1171  		}
  1172  
  1173  		r.Parameters = p
  1174  	case RulesetRuleTypeMaxFileSize:
  1175  		p := &MaxFileSizeRuleParameters{}
  1176  
  1177  		if w.Parameters != nil {
  1178  			if err := json.Unmarshal(w.Parameters, p); err != nil {
  1179  				return err
  1180  			}
  1181  		}
  1182  
  1183  		r.Parameters = p
  1184  	case RulesetRuleTypeWorkflows:
  1185  		p := &WorkflowsRuleParameters{}
  1186  
  1187  		if w.Parameters != nil {
  1188  			if err := json.Unmarshal(w.Parameters, p); err != nil {
  1189  				return err
  1190  			}
  1191  		}
  1192  
  1193  		r.Parameters = p
  1194  	case RulesetRuleTypeCodeScanning:
  1195  		p := &CodeScanningRuleParameters{}
  1196  
  1197  		if w.Parameters != nil {
  1198  			if err := json.Unmarshal(w.Parameters, p); err != nil {
  1199  				return err
  1200  			}
  1201  		}
  1202  
  1203  		r.Parameters = p
  1204  	}
  1205  
  1206  	return nil
  1207  }