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