generatePathExtensions method

String generatePathExtensions(
  1. String parent
)

Implementation

String generatePathExtensions(
  String parent,
) {
  var relativePath = path.substring(parent.length);
  if (parent.isNotEmpty && relativePath.startsWith('/')) {
    relativePath = relativePath.substring(1);
  }

  final fullPathParams = findPathParameters(path);

  final relativePathParams = findPathParameters(relativePath);

  final pathWithParams = path.replaceAllMapped(
    RegExp(r':([\d\w_]+)'),
    (m) => '\$${m[1]}',
  );

  var pathClass = path.replaceAll('/', '').replaceAll(':', '').toTypeName();
  var parentPathClass = pathClass.isEmpty
      ? 'HypenPath'
      : parent.replaceAll('/', '').replaceAll(':', '').toTypeName();

  if (pathClass.isEmpty) {
    pathClass = 'HypenRootPath';
  }

  if (parentPathClass.isEmpty) {
    parentPathClass = 'HypenRootPath';
  }

  if (relativePath == '/') {
    relativePath = 'root';
  }
  relativePath = relativePath.replaceAll(':', '');

  final ret = path == parent
      ? ''
      : '''
class $pathClass {
const $pathClass(
  ${fullPathParams.map((p) => 'required this.$p').join(',').wrapWith('{}')}
);
${fullPathParams.map((p) => 'final String $p;').join()}

String get path => '$pathWithParams';
}

extension Get$pathClass on $parentPathClass {
$pathClass ${relativePathParams.isEmpty ? 'get $relativePath' : '''
$relativePath({${relativePathParams.map(
                (p) => 'required String $p',
              ).join(',')}})
'''} =>
$pathClass(${fullPathParams.map((p) => '$p: $p').join(',')});
}

''';
  return '''
$ret
${children.map((c) => c.generatePathExtensions(path)).join('\n')}
''';
}