visitRuntimeBefore()

in lib/generator.js [1254:1286]


  visitRuntimeBefore(ast, level, env) {
    assert.equal(ast.type, 'object');
    const retryType = this.getRealModelName('Darabonba.RetryPolicy', 'RetryOptions');
    this.emit(`Dictionary<string, object> ${RUNTIME} = `, level);
    // this.visitConstructObject(ast, level, env);
    // TODO 这里有个问题:当runtime不是全量的,例如只有一个retry: true时,左边类型为Dictionary<string, object>,右边类型为Dictionary<string, bool?>,会报错
    // 现在openapi中是全量的,所以暂时没有问题
    this.visitObject(ast, level, env);
    this.emit(';\n');
    this.emit('\n');
    this.emit('RetryPolicyContext _retryPolicyContext = null;\n', level);
    this.emit('Darabonba.Request _lastRequest = null;\n', level);
    this.emit('Darabonba.Response _lastResponse = null;\n', level);
    this.emit('Exception _lastException = null;\n', level);
    this.emit('long _now = System.DateTime.Now.Millisecond;\n', level);
    this.emit('int _retriesAttempted = 0;\n', level);
    this.emit('_retryPolicyContext = new RetryPolicyContext\n', level);
    this.emit('{\n', level);
    this.emit('RetriesAttempted = _retriesAttempted\n', level + 1);
    this.emit('};\n', level);
    this.emit(`while (Core.ShouldRetry((${retryType})${RUNTIME}["retryOptions"], _retryPolicyContext))\n`, level);
    this.emit('{\n', level);
    this.emit('if (_retriesAttempted > 0)\n', level + 1);
    this.emit('{\n', level + 1);
    this.emit(`int backoffTime = Core.GetBackoffDelay((${retryType})${RUNTIME}["retryOptions"], _retryPolicyContext);\n`, level + 2);
    this.emit('if (backoffTime > 0)\n', level + 2);
    this.emit('{\n', level + 2);
    this.emit('Core.Sleep(backoffTime);\n', level + 3);
    this.emit('}\n', level + 2);
    this.emit('}\n', level + 1);
    this.emit('try\n', level + 1);
    this.emit('{\n', level + 1);
  }