blob: 003117412669b8fdf5d4ee6d7d605c1c456669de [file] [log] [blame]
// Copyright 2020 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'dart:async';
import 'package:fidl/fidl.dart';
import 'package:fidl_fuchsia_examples_inspect/fidl_async.dart' as fidl_codelab;
import 'package:fuchsia_logger/logger.dart';
import 'package:fuchsia_inspect/inspect.dart' as inspect;
import 'package:fuchsia_services/services.dart';
class _FizzBuzzImpl extends fidl_codelab.FizzBuzz {
final Set<fidl_codelab.FizzBuzzBinding> _bindingSet = {};
final inspect.Node _node;
_FizzBuzzImpl(this._node) {
_node.intProperty('incoming_connection_count').setValue(0);
_node.intProperty('closed_connection_count').setValue(0);
_node.intProperty('request_count').setValue(0);
// Unlike Rust and C++, Dart inspect doesn't support exponential histograms.
// TODO(fxb/44725): when exponential histograms are added create an
// exponential histogram named "request_time_histogram_us", with the
// floor=1, initial_step=2, step_multiplier=2, buckets=16.
}
void bind(InterfaceRequest<fidl_codelab.FizzBuzz> request) {
_node.intProperty('incoming_connection_count').add(1);
var binding = fidl_codelab.FizzBuzzBinding();
binding.stateChanges.listen((state) {
if (state == InterfaceState.closed) {
_node.intProperty('closed_connection_count').add(1);
_bindingSet.remove(binding);
}
});
binding.bind(this, request);
_bindingSet.add(binding);
}
@override
Future<String> execute(int count) async {
_node.intProperty('request_count').add(1);
var output = '';
for (var i = 1; i <= count; i++) {
if (i != 1) {
output += ' ';
}
if (i % 3 == 0) {
output += 'Fizz';
}
if (i % 5 == 0) {
output += 'Buzz';
}
if (i % 3 != 0 && i % 5 != 0) {
output += i.toString();
}
}
return output;
}
}
void main(List<String> args) {
setupLogger(name: 'inspect_dart_codelab', globalTags: ['fizzbuzz']);
log.info('starting up...');
final inspectNode = inspect.Inspect().root;
final fizzbuzz = _FizzBuzzImpl(inspectNode);
StartupContext.fromStartupInfo()
.outgoing
.addPublicService<fidl_codelab.FizzBuzz>(
fizzbuzz.bind, fidl_codelab.FizzBuzz.$serviceName);
}