code: func shouldIncludeNode(eCtx *executionContext, directives []*ast.Directive) bool {
  	var (
  		skipAST, includeAST *ast.Directive
  		argValues           map[string]interface{}
  	)
  	for _, directive := range directives {
  		if directive == nil || directive.Name == nil {
  			continue
  		}
  		switch directive.Name.Value {
  		case SkipDirective.Name:
  			skipAST = directive
  		case IncludeDirective.Name:
  			includeAST = directive
  		}
  	}
  	// precedence: skipAST > includeAST
  	if skipAST != nil {
  		argValues = getArgumentValues(SkipDirective.Args, skipAST.Arguments, eCtx.VariableValues)
  		if skipIf, ok := argValues["if"].(bool); ok && skipIf {
  			return false // excluded selectionSet's fields
  		}
  	}
  	if includeAST != nil {
  		argValues = getArgumentValues(IncludeDirective.Args, includeAST.Arguments, eCtx.VariableValues)
  		if includeIf, ok := argValues["if"].(bool); ok && !includeIf {
  			return false // excluded selectionSet's fields
  		}
  	}
  	return true
  }
docs: // Determines if a field should be included based on the @include and @skip
  // directives, where @skip has higher precedence than @include.