part of mustache;

/// Passed as an argument to a mustache lambda function.
class _LambdaContext implements LambdaContext {
  
  final _Node _node;
  final _Renderer _renderer;
  final bool _isSection;
  bool _closed = false;
  
  _LambdaContext(this._node, this._renderer, {bool isSection: true})
      : _isSection = isSection;
  
  void close() {
    _closed = true;
  }
  
  _checkClosed() {
    if (_closed) throw new _TemplateException(
        'LambdaContext accessed outside of callback.', 
        _renderer._templateName, _renderer._source, _node.start);
  }

  //TODO is allowing adding value to the stack a good idea?? Not sure.
  String renderString({Object value}) {
    _checkClosed();
    var buffer = new StringBuffer();
    _renderer._renderSubtree(_node, buffer, value: value);
    return buffer.toString();
  }

  //TODO is allowing adding value to the stack a good idea?? Not sure.
  void render({Object value}) {
    _checkClosed();
    _renderer._renderSubtree(_node, _renderer._sink, value: value);
  }

  void write(Object object) {
    _checkClosed();
    _renderer._sink.write(object);
  }

  String get source {
    _checkClosed();
    
    var nodes = _node.children;
    
    if (nodes.isEmpty) return '';
    
    if (nodes.length == 1 && nodes.first.type == _TEXT)
      return nodes.first.value;
    
    var source = _renderer._source.substring(
        _node.contentStart, _node.contentEnd);
    
    return source;
  }

  //TODO is allowing adding value to the stack a good idea?? Not sure.
  String renderSource(String source, {Object value}) {
    _checkClosed();
    var sink = new StringBuffer();
    // Lambdas used for sections should parse with the current delimiters.
    var delimiters = _isSection ? _renderer._delimiters : '{{ }}';
    var node = _parse(source,
        _renderer._lenient,
        _renderer._templateName,
        delimiters);
    var renderer = new _Renderer.lambda(
        _renderer,
        node,
        source,
        _renderer._indent,
        sink,
        _renderer._delimiters);
    
    if (value != null) renderer._stack.add(value);
    renderer.render();
    if (value != null) renderer._stack.removeLast();
    
    return sink.toString();
  }

  /// Lookup the value of a variable in the current context.
  Object lookup(String variableName) {
    _checkClosed();
    return _renderer._resolveValue(variableName);
  }

}